一直在看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;這種方法感受像是建立數組指向存儲區域,而後對數組操做,省掉了首地址了。我是這麼理解的,不知道對不對。
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.
第一次寫,新手請輕噴!!!
有時間再寫繪製函數的筆記好了,內容不多,僅看成本身的複習!!