【opencv】圖像元素的訪問

    一直在看opencv,但都是斷斷續續,不成體系,知識點過於凌亂,今天第一次作筆記,爲了本身更好的理解,也爲了有和我同樣興趣的人蔘考。正文以下: 數組

    這篇筆記主要記錄一下圖像元素的訪問: 函數

單通道字節圖像的訪問

1.用cvGet2D()和cvSet2D(): spa

    cvGet2D()函數的原型:CvScalar cvGet2D( const CvArr* arr, int idx0, int idx1 ),返回的是一個CvScalar類型的容器,idx0和idx1分別表示的是該點到圖像(0,0)點的垂直距離和水平距離,和咱們通常理解的相反。 指針

    cvSet2D也相似,只不過加了一個要設置的cvScalar類型的參數
code

例如: 原型

cvScalar test;
IplImage* image = cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,1);//建立一個單通道無符號整形字節圖像
test = cvGet2D(image,x,y);//返回的數據賦值給cvScalar類型的test
printf("result:%f\n",test.val[0]);//列印出單通道(x,y)的值
cvSet2D(image,x,y,test);//cvSet2D的使用


2.直接訪問: opencv

例如: class

IplImage* image = cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,1);
((uchar*)( image->imageData + i*image->widthStep))[j] = 255;
image->imageData:存儲圖像像素值數組的首地址

image->widthStep:指的是圖像每行所佔的字節數,這個概念不要和width混淆。(每每由於存儲要遵循字節對齊的原則,widthStep並非單純的像素數*nChannels,每每會更大一點) test

因此由於是單通道的圖像,因此(.....)[j]就是(i,j)點的值
容器


3.指針直接訪問:

例如:

IplImage* image = cvCreateImage(cvSize(200,200),IPL_DEPTH_8U,1);
int height = image->height;
int width = image->width;
int widthstep = image->widthStep;
uchar* data = (uchar*) image->imageData;
data[i*widthstep+j] = 255;
這種方法感受像是建立數組指向存儲區域,而後對數組操做,省掉了首地址了。我是這麼理解的,不知道對不對。



多通道字節圖像的訪問

1.其實和單通道差很少,只不過通道數變多了,像第一種方法中cvGet2D返回的test就能夠取出相對應的bgr通道的值了:test[0],test[1].test[2]。cvSet2D的用法不變


2.直接訪問的方式就要加上:

((uchar*)( image->imageData + i*image->widthStep))[j*nChannels+0] = 255;//或者+1,+2分別表示bgr通道的值


3.指針的方式同上一種:

data[i*widthstep+j*nChannels+k] = 255;//k的值爲0-通道數


OK,That's all.

第一次寫,新手請輕噴!!!

有時間再寫繪製函數的筆記好了,內容不多,僅看成本身的複習!!

相關文章
相關標籤/搜索