日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv学习笔记2--存取图像元素

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv学习笔记2--存取图像元素 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近了解了下如何存取圖像元素,在這里歸納總結下,也是記錄下,以后需要的時候可以復習下。


假設需要讀取在i行j列像點的第k通道. 其中, 行數i的范圍為[0, height-1], 列數j的范圍為[0, width-1], 通道k的范圍為[0, nchannels-1].

?

1.間接存取: (比較通用, 但效率低, 可讀取任一類型圖像數據)

對單通道字節圖像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); CvScalar s; s=cvGet2D(img,i,j); // get the (i,j) pixel value printf("intensity=%f\n",s.val[0]); s.val[0]=111; cvSet2D(img,i,j,s); // set the (i,j) pixel value

對多通道浮點或字節圖像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); CvScalar s; s=cvGet2D(img,i,j); // get the (i,j) pixel value printf("B=%f, G=%f, R=%f\n",s.val[0],s.val[1],s.val[2]); s.val[0]=111; s.val[1]=111; s.val[2]=111; cvSet2D(img,i,j,s); // set the (i,j) pixel value

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.用指針直接存取 : (在某些情況下簡單高效)

對單通道字節圖像:

IplImage* img =cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); int height = img->height; int width = img->width; int step = img->widthStep/sizeof(uchar); uchar* data =(uchar *)img->imageData; data[i*step+j] = 111;

對多通道字節圖像:

IplImage* img =cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); int height = img->height; int width = img->width; int step = img->widthStep/sizeof(uchar); int channels =img->nChannels; uchar* data =(uchar *)img->imageData; data[i*step+j*channels+k] = 111;

對單通道浮點圖像(假設用4字節調整):

IplImage* img =cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); int height = img->height; int width = img->width; int step = img->widthStep/sizeof(float); int channels =img->nChannels; float * data =(float *)img->imageData; data[i*step+j*channels+k] = 111;

4.使用 c++ wrapper 進行直接存取: (簡單高效)

對單/多通道字節圖像,多通道浮點圖像定義一個 c++ wrapper:

template<class T> classImage {private:IplImage* imgp;public:Image(IplImage* img=0){imgp=img;}~Image(){imgp=0;}void operator=(IplImage*img) {imgp=img;}inline T*operator[](const int rowIndx) {return ((T*)(imgp->imageData + rowIndx*imgp->widthStep));} }; typedef struct{unsigned char b,g,r; } RgbPixel; typedef struct{float b,g,r; } RgbPixelFloat; typedef Image<RgbPixel> RgbImage; typedef Image<RgbPixelFloat> RgbImageFloat; typedef Image<unsigned char> BwImage; typedefImage<float> BwImageFloat;

單通道字節圖像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1); BwImage imgA(img); imgA[i][j] = 111;

多通道字節圖像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3); RgbImage imgA(img); imgA[i][j].b = 111; imgA[i][j].g = 111; imgA[i][j].r = 111;

多通道浮點圖像:

IplImage*img=cvCreateImage(cvSize(640,480),IPL_DEPTH_32F,3); RgbImageFloat imgA(img); imgA[i][j].b = 111; imgA[i][j].g = 111; imgA[i][j].r = 111;

總結

以上是生活随笔為你收集整理的opencv学习笔记2--存取图像元素的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。