参考网址:
http://docs.opencv.org/modules/core/doc/basic_structures.html
http://docs.opencv.org/doc/user_guide/ug_mat.html
http://docs.opencv.org/trunk/opencv_cheatsheet.pdf
一、基本数据
在存取图像数据前,首先我们有必要了解OpenCV中定义的类Vec
二,加载图像
加载图像
Mat img = imread(filename)
imread默认是读取图像文件,创建3通道图像数据。如果要创建单通道灰度图像,可用如下命令:
Mat img = imread(filename,0)
三、访问图像象元
访问图像数据时,需要特别注意数据类型。
对于单通道图像,我们要获取某个位置(y,x)的像素值,可采用如下语句:
Scalar intensity = img.at<uchar>(y, x);
对3通道彩色图像有,我们可以采用如下的方式访问BGR数据:
Vec3b intensity = img.at<Vec3b>(y, x);
uchar blue = intensity.val[0];
uchar green = intensity.val[1];
uchar red = intensity.val[2];
类似的,对浮点型的3通道彩色图像,我们可以采用如下的方式访问BGR数据:
Vec3f intensity = img.at<Vec3f>(y, x);
float blue = intensity.val[0];
float green = intensity.val[1];
float red = intensity.val[2];
除用下标访问之外,我们还可以采用迭代器访问:
Mat_<Vec3b>::iterator it = image.begin<Vec3b>(),itEnd = image.end<Vec3b>();
for(; it != itEnd; ++it){
uchar blue = (*it)[0];
uchar green = (*it)[1];
uchar red = (*it)[2];
}
如果要改变象元BGR分量的强度值,我们可以采用以下方式:
img.at<uchar>(y, x) = 128;
或者
for(int i = 0; i < 100; i++)
img(i,i)=Vec3b(255,255,255);
或者
Mat_<Vec3b>::iterator it = image.begin<Vec3b>(),itEnd = image.end<Vec3b>();
for(; it != itEnd; ++it){
*it=Vec3b(255,(*it)[1] ,(*it)[2] );
}
选定图像的感兴趣区域
Rect r(10, 10, 100, 100);
Mat smallImg = img(r);
从 IplImage 到 Mat
Mat img = imread("image.jpg");
IplImage img1 = img;
CvMat m = img;
从彩色图像到灰度图像
Mat img = imread("image.jpg"); // loading a 8UC3 image
Mat grey;
cvtColor(img, grey, CV_BGR2GRAY);
从8UC1 到 32FC1:
src.convertTo(dst, CV_32F);
五、可视化图像
对于8U格式的图像,我们可以如下可视化
Mat img = imread("image.jpg");
namedWindow("image", CV_WINDOW_AUTOSIZE);
imshow("image", img);
waitKey();