程序完成图片读写 图片显示 图片色彩空间转换
</pre><pre name="code" class="cpp">#include <string>
#include<opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(){
/*read image*/
string imgAdress = "E:\\Workspace\\VisualStudioWorkspace\\lena.jpg";//使用了图片的绝对地址
Mat img = imread(imgAdress,IMREAD_COLOR);
Mat imgGray = imread(imgAdress, IMREAD_GRAYSCALE); //可以使用第二个参数选择读入图片后的存储格式
/*check*/
if (img.empty()){
cout << "Can't read or can't open the image!";
return -1;
}
/*show the original image */
//namedWindow("My lena image", WINDOW_AUTOSIZE);//creats a new window, not necessary
imshow("My lena image", img);
/*real copy <span style="font-family: Arial, Helvetica, sans-serif;">会有两份独立的data </span>*/
Mat imgCopy;
img.copyTo(imgCopy); //or
//imgCopy = img.clone();
//convert color
Mat imgBGR2GRAY, imgRGB2Gray;
cvtColor(img, imgBGR2GRAY, COLOR_BGR2GRAY);
cvtColor(img, imgRGB2Gray, COLOR_RGB2GRAY);// wrong 出来的图片很相似 但是并不正确
imshow("imgGray",imgGray);
imshow("imgBGR2GRAY", imgBGR2GRAY);
imshow("imgRGB2Gray", imgRGB2Gray);
/*write image*/
imwrite("imgBGR2GRAY.jpg", imgBGR2GRAY);
imwrite("imgRGB2Gray.jpg", imgRGB2Gray);
waitKey();
return 0;
}
Mat - 基本图像容器
Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。
Mat A, C; // 只创建信息头部分
A = imread(argv[1], CV_LOAD_IMAGE_COLOR);// 这里为矩阵开辟内存
Mat B(A); // 使用拷贝构造函数
C = A; // 赋值运算符
以上代码中的所有Mat对象最终都指向同一个数据矩阵。
Mat F = A.clone();
Mat G;
A.copyTo(G);
真实地拷贝,A、F、G矩阵是独立的,并不会相互影响。
总结:
OpenCV函数中输出图像的内存分配是自动完成的(如果不特别指定的话)。
使用OpenCV的C++接口时不需要考虑内存释放问题。
赋值运算符和拷贝构造函数(ctor )只拷贝信息头。
使用函数 clone() 或者 copyTo() 来拷贝一副图像的矩阵。