opencv访问图像数据

来源:互联网 发布:淘宝api接口开发教程 编辑:程序博客网 时间:2024/05/22 12:24

上接上篇http://blog.csdn.net/m0_37407756/article/details/78530539

访问图像数据

与CvMat类似,都有三种方法。

函数的方法:

[cpp] view plain copy
  1. IplImage* img=cvLoadImage(filename);  
  2. CvScalar s;       /*sizeof(s) == img->nChannels*/  
  3. s=cvGet2D(img,i,j);  /*get the (i,j) pixel value*/  
  4. cvSet2D(img,i,j,s);   /*set the (i,j) pixel value*/  


[cpp] view plain copy
  1.   
[html] view plain copy
  1. <span style="font-family:Verdana, Arial, Helvetica, sans-serif;background-color:rgb(51,255,51);">采用宏的方法:</span>  

[cpp] view plain copy
  1.   

IplImage* img; //malloc memory by cvLoadImage or cvCreateImage

[cpp] view plain copy
  1. for(int row = 0; row < img->height; row++)  
  2. {  
  3.     for (int col = 0; col < img->width; col++)  
  4.     {  
  5.         b = CV_IMAGE_ELEM(img, UCHAR, row, col * img->nChannels + 0);   
  6.         g = CV_IMAGE_ELEM(img, UCHAR, row, col * img->nChannels + 1);   
  7.         r = CV_IMAGE_ELEM(img, UCHAR, row, col * img->nChannels + 2);  
  8.     }  
  9. }  


使用指针的方法

在这之前要弄清楚IplImage与Cvmat的一些差别,剩下的用法类似。IplImage在计算行地址的时候也要采用行长度widthStep而不是图像的宽度,与CvMat中step类似。IplImage图像的首地址记作imageData,与CvMat中data类似。IplImage访问时指针设置为(uchar*),而CvMat中data为联合类型,必须说明使用的指针类型。

/*指针访问*/

[cpp] view plain copy
  1. IplImage* img; //malloc memory by cvLoadImage or cvCreateImage  
  2. uchar b, g, r; // 3 channels  
  3. for(int row = 0; row < img->height; row++)  
  4. {  
  5.     for (int col = 0; col < img->width; col++)  
  6.     {  
  7.         b = ((uchar *)(img->imageData + row * img->widthStep))[col * img->nChannels + 0];   
  8.         g = ((uchar *)(img->imageData + row * img->widthStep))[col * img->nChannels + 1];   
  9.         r = ((uchar *)(img->imageData + row * img->widthStep))[col * img->nChannels + 2];  
  10.     }  
  11. }  

 一个比较综合的应用

这里定义一个稍微复杂一点的应用,包括了对图像的常用操作,基本上足够用来实现其他的图像算法了。

首先读入一幅图像,若为3通道的则转化为一通道,然后将图像右下角1/4置为白色。

 

[cpp] view plain copy
  1. #include <opencv2\opencv.hpp>    
  2.   
  3. int main()  
  4. {  
  5.     IplImage *img = cvLoadImage("D:\\_Gonzalez\\ch02\\Fig0205(a)(cktboard_200dpi).tif");  
  6.     //获取图像的参数    
  7.     printf("width=%d\n", img->width);  
  8.     printf("height=%d\n", img->height);  
  9.     printf("channel=%d\n", img->nChannels);  
  10.   
  11.     if (img->nChannels == 3)  
  12.     {  
  13.         //新建一个与img一样大的一通道空图像    
  14.         IplImage *dst = cvCreateImage(cvSize(img->width, img->height), img->depth, 1);  
  15.         //将彩色图像转化为一通道灰度图    
  16.         cvCvtColor(img, dst, CV_RGB2GRAY);  
  17.         img = dst;  
  18.     }  
  19.   
  20.     for (int y = img->height / 2; y < img->height; y++)  
  21.     {  
  22.         uchar* ptr = (uchar*)(img->imageData + y*img->widthStep);  
  23.         for (int x = img->width / 2; x < img->width; x++)  
  24.         {  
  25.             ptr[x + 1] = 255;  
  26.             ptr[x + 2] = 255;  
  27.             ptr[x + 3] = 255;  
  28.         }  
  29.     }  
  30.   
  31.     cvNamedWindow("example", CV_WINDOW_AUTOSIZE);  
  32.     cvShowImage("example", img);  
  33.   
  34.     cvWaitKey(0);  
  35.     cvReleaseImage(&img);  
  36.     cvDestroyWindow("example");  
  37. }  

 如果将要求改为将三通道的img右下角1/4置为白色,相应操作变成:

 

[cpp] view plain copy
  1. for (int y = img->height / 2; y < img->height; y++)  
  2. {  
  3.     uchar* ptr = (uchar*)(img->imageData + y*img->widthStep);  
  4.     for (int x = img->width / 2; x < img->width; x++)  
  5.     {  
  6.         ptr[x + 1] = 255;  
  7.         ptr[x + 2] = 255;  
  8.         ptr[x + 3] = 255;  
  9.   
  10.         /*也可以是 
  11.         *(ptr+3*x+1) = 255; 
  12.         *(ptr+3*x+2) = 255; 
  13.         *(ptr+3*x+2) = 255; 
  14.         */  
  15.     }  
  16. }  
阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 结扎好不好 结扎后 如何结扎 结扎后恢复 结扎恢复 结扎术 结扎费用 结扎输卵管 微创结扎 结扎医院 男人结扎后还能射 男人结扎后还能射吗 男性结扎坏处 结扎什么意思 男性结扎后还会射吗 男性结扎的危害 结扎对男人有什么伤害 女子结扎真实图 输精管结扎术 结扎复通找杭州红房子 结扎还能恢复吗 男的结扎后还能恢复吗 男的结扎后还能修复吗 结扎还可以恢复生育吗 男士结扎后还能恢复吗 男性结扎后还能恢复吗 女人结扎后还能恢复生育吗 男性结扎后可以复通吗 女的结扎了还能生孩子吗 男人结扎可以恢复吗 女子结扎后还能生育吗 男子结扎后还能恢复吗 结扎能恢复吗 男结扎后可以恢复吗 男性结扎可以恢复吗 结扎还会怀孕吗 男生结扎后可以恢复吗 男人结扎有什么坏处 男人怎么结扎 男人结扎的影响 结扎对男性的影响