opencv獲取像素的值


 

opencv中獲取圖像像素的方法

方法一:

   IplImage *img = cvLoadImage("Lena.jpg", 0);

   CvScalar pixel;
 for (int i = 0; i < img->height; ++i)
 {
     for (int j = 0; j < img->width; ++j)
      {
         //獲得像素的RGB值並顯示    

          pixel = cvGet2D(img, i, j);
           printf("B=%f,G=%f,R=%f\t", pixel.val[0], pixel.val[1], pixel.val[2]);
         //修改各點的值
          pixel.val[0] = 0;   // B分量
          pixel.val[1] = 0;   // G分量
          pixel.val[2] = 0;   // R分量
         cvSet2D(img, i, j, pixel);
  }
 }

注意內存中存儲順序是BGR

方法二:

 for (int i = 0; i < img->height; ++i)
 {
        for (int j = 0; j < img->width; ++j)
     {

        int  b = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3);

        int  g = CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+1);

        int  r= CV_IMAGE_ELEM(paintx, uchar, y1, x1 * 3+2);
      }

}

方法三:

對於單通道字節型圖像:

 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); 

 ((uchar *)(img->imageData + i*img->widthStep))[j]=111;

對於多通道字節型圖像:

IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); 

 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B

 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G

 ((uchar *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

對於多通道浮點型圖像:

 IplImage* img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); 

 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 0]=111; // B

 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 1]=112; // G

 ((float *)(img->imageData + i*img->widthStep))[j*img->nChannels + 2]=113; // R

 

3 ((uchar*)(Img1->imageData + Img1->widthStep*pt.y))[pt.x]的具體含義:
 (1)這里img1->imagedata指的圖像第一行的首地址,pt.y是指圖像的height(圖像高像素數即行數),y乘以img->widthstep(排列的圖像行大小)即首地址加上行數乘以每行總數,得到第y行的首地址。widthstep是指圖像每行所占的字節數,主要要和width區別,width是指每行所含的像素個數,但是一個像素也可能占一個字節,也可能占三個字節或者四個。imagedata是指向存儲圖像像素值數組的指針,內容是這個數組的首地址,pt.y指的是像素點的行坐標,所以Img->imageData + Img->widthStep*pt.y便是該像素點所在行的首地址,然后再加上該像素點所在的列,即pt.x,就得到了該像素點的地址,所以那句代碼也可以寫成

((uchar*)(Img1->imageData + Img1->widthStep*pt.y+pt.x)),

都是指該像素點的像素值,至於強制類型轉換,是因為會產生一些負值,而像素值是不能為負的。

(2)widthStep表示存儲一行像素需要的字節數。
widthStep必須是4的倍數,如果8U圖像寬度為3,那么widthStep是4,加一個字節補齊。這個圖像的一行需要4個字節,只使用前3個,最后一個空在那兒不用。也就是一個寬3高3的圖像的imageData數據大小為4*3=12字節。如果32F的圖像,那么widthStep=width*4。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM