opencv学习笔记 一 载入、显示和保存图像


预备知识:

opencv2用cv::Mat类型来声明表示图像的变量。例如:

cv::Mat image;		//建立高度和宽度为0的图像,默认尺寸为0
也可以指定初始尺寸

Mat image(240,320,CV_8U,Scalar(100));	//CV_8U表示8位无符号整形

Mat容器内元素的数据类型介绍

CV_<bit_depth>(S|U|F)C<number_of_channels>

     1--bit_depth---比特数---代表8bite,16bites,32bites,64bites---举个例子吧--比如说,如
        如果你现在创建了一个存储--灰度图片的Mat对象,这个图像的大小为宽100,高100,那么,现在这张
        灰度图片中有10000个像素点,它每一个像素点在内存空间所占的空间大小是8bite,8位--所以它对
        应的就是CV_8
     2--S|U|F--S--代表---signed int---有符号整形
               U--代表--unsigned int--无符号整形
               F--代表--float---------单精度浮点型
     3--C<number_of_channels>----代表---一张图片的通道数,比如:
         1--灰度图片--grayImg---是--单通道图像
         2--RGB彩色图像---------是--3通道图像
         3--带Alph通道的RGB图像--是--4通道图像

通过cv::Mat的size()方法可以获取图像的尺寸

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
	Mat image;
	cout << "sizeof image = " << image.size().height<<"   "<< image.size().width << endl;
	waitKey(0);
	return 0;
}
输出结果:
sizeof image = 0   0

下面的读取函数 进行文件读取、解码和内存的分配:

image = cv::imread("1.png");	
判断是否读取成功的函数(在读取文件时要判断是否读取成功):

if (!image.data)	//未成功读取时,image.data为0
{
	cout << "wrong!" << endl;
	return -1;
}
if (image.empty())	//读取成功时候,image.empty()为0
{
	cout << "wrong!" << endl;
	return -1;
}
定义窗口和显示图像:

namedWindow("picture1");	//定义窗口	不加这句也可以显示图像
imshow("picture1", image);	//在定义的窗口内显示图像
垂直反转和水平反转:

Mat result;
flip(image, result, num);	//num大于0表示水平反转,0表示垂直反转,负数表示既有水平又有垂直反转
保存图片文件:

imwrite("D:/2.png",result);	//将图像数据结果保存到D:/2.png(创建了图片2.png)


CV::Mat 实现引用计数和浅拷贝:

图像之间进行赋值时,图像数据没有发生复制,两个对象指向同一块内存

引用计数的目的是当所有引用内存数据对象都析构后,才会释放内存块。

尽量避免返回Mat类成员(返回时候仅发生浅拷贝,一旦再次调用这个函数,之前返回的Mat数据可能发生变化,可以返回一个深拷贝的成员来避免这种错误)

深拷贝只能用:

	result.copyto(image2);		//将result拷贝到image2























































智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告