opencv访问图像数据
来源:互联网 发布:淘宝api接口开发教程 编辑:程序博客网 时间:2024/05/22 12:24
上接上篇http://blog.csdn.net/m0_37407756/article/details/78530539
访问图像数据
与CvMat类似,都有三种方法。
函数的方法:
- IplImage* img=cvLoadImage(filename);
- CvScalar s;
- s=cvGet2D(img,i,j);
- cvSet2D(img,i,j,s);
- <span style="font-family:Verdana, Arial, Helvetica, sans-serif;background-color:rgb(51,255,51);">采用宏的方法:</span>
IplImage* img; //malloc memory by cvLoadImage or cvCreateImage
- for(int row = 0; row < img->height; row++)
- {
- for (int col = 0; col < img->width; col++)
- {
- b = CV_IMAGE_ELEM(img, UCHAR, row, col * img->nChannels + 0);
- g = CV_IMAGE_ELEM(img, UCHAR, row, col * img->nChannels + 1);
- r = CV_IMAGE_ELEM(img, UCHAR, row, col * img->nChannels + 2);
- }
- }
使用指针的方法
在这之前要弄清楚IplImage与Cvmat的一些差别,剩下的用法类似。IplImage在计算行地址的时候也要采用行长度widthStep而不是图像的宽度,与CvMat中step类似。IplImage图像的首地址记作imageData,与CvMat中data类似。IplImage访问时指针设置为(uchar*),而CvMat中data为联合类型,必须说明使用的指针类型。
/*指针访问*/
- IplImage* img;
- uchar b, g, r;
- for(int row = 0; row < img->height; row++)
- {
- for (int col = 0; col < img->width; col++)
- {
- b = ((uchar *)(img->imageData + row * img->widthStep))[col * img->nChannels + 0];
- g = ((uchar *)(img->imageData + row * img->widthStep))[col * img->nChannels + 1];
- r = ((uchar *)(img->imageData + row * img->widthStep))[col * img->nChannels + 2];
- }
- }
一个比较综合的应用
这里定义一个稍微复杂一点的应用,包括了对图像的常用操作,基本上足够用来实现其他的图像算法了。
首先读入一幅图像,若为3通道的则转化为一通道,然后将图像右下角1/4置为白色。
- #include <opencv2\opencv.hpp>
-
- int main()
- {
- IplImage *img = cvLoadImage("D:\\_Gonzalez\\ch02\\Fig0205(a)(cktboard_200dpi).tif");
-
- printf("width=%d\n", img->width);
- printf("height=%d\n", img->height);
- printf("channel=%d\n", img->nChannels);
-
- if (img->nChannels == 3)
- {
-
- IplImage *dst = cvCreateImage(cvSize(img->width, img->height), img->depth, 1);
-
- cvCvtColor(img, dst, CV_RGB2GRAY);
- img = dst;
- }
-
- for (int y = img->height / 2; y < img->height; y++)
- {
- uchar* ptr = (uchar*)(img->imageData + y*img->widthStep);
- for (int x = img->width / 2; x < img->width; x++)
- {
- ptr[x + 1] = 255;
- ptr[x + 2] = 255;
- ptr[x + 3] = 255;
- }
- }
-
- cvNamedWindow("example", CV_WINDOW_AUTOSIZE);
- cvShowImage("example", img);
-
- cvWaitKey(0);
- cvReleaseImage(&img);
- cvDestroyWindow("example");
- }
如果将要求改为将三通道的img右下角1/4置为白色,相应操作变成:
- for (int y = img->height / 2; y < img->height; y++)
- {
- uchar* ptr = (uchar*)(img->imageData + y*img->widthStep);
- for (int x = img->width / 2; x < img->width; x++)
- {
- ptr[x + 1] = 255;
- ptr[x + 2] = 255;
- ptr[x + 3] = 255;
-
-
-
-
-
-
- }
- }
'); })();