opencv感兴趣通道COI的使用
opencv中設置和獲取感興趣通道COI的函數如下:
SetImageCOI 設置感興趣通道
void cvSetImageCOI( IplImage* image, int coi );
image?圖像頭.??
coi?感興趣通道.
函數 cvSetImageCOI 基于給定的值設置感興趣的通道。值 0 意味著所有的通道都被選定, 1 意味著第一個通道被選定等等。如果 ROI 是 NULL 并且COI!= 0, COI 被分配.
GetImageCOI 返回感興趣通道號
int cvGetImageCOI( const IplImage* image );
函數cvGetImageCOI 返回圖像的感興趣通道(當所有的通道都被選中返回值是0).
要注意的是,大多數的opencv函數并不支持COI。
以下面代碼為例:
IplImage* imgCOI1=cvLoadImage("lena.bmp");
cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);?
cvSetImageCOI( imgCOI1 ,1 );
cvShowImage("mainWin", imgCOI1 );?
以上代碼讀入一張圖像,設置感興趣區域為1(即Blue通道),然后顯示出來。顯示結果仍為彩色圖像,也就是說cvShowImage函數并不支持COI的設定。
對于上面問題的解決方案:在opencv中 cvCopy 或cvSplit是支持感興趣通道COI的
cvCopy():
cvCopy的原型是:void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
cvCopy函數將設置過感興趣通道COI的源圖像復制到匹配大小的目標圖像中。只復制COI通道
注意:在使用cvCopy這個函數之前,你必須用cvCreateImage()一類的函數先開一段內存。后面的cvSplit也是同樣的要求
?cvSplit():
有些時候處理多通道圖像時不是很方便,在這種情況下,可以利用cvSplit()分別復制每個通道到多個單通道圖像。函數原型:void?cvSplit(const?CvArr*?src,CvArr?*dst0,CvArr?*dst1,?CvArr?*dst2,?CvArr?*dst3)??
如果需要,cvSplit()函數將復制src(即源多通道圖像)的各個通道到圖像dst0、dst1、dst2、dst3中。
目標圖像必須與源圖像在大小和數據類型上匹配,當然也應該是單通道的圖像。
如果源圖像少于4個通道(這種情況經常出現),那么傳遞給cvSplit()的不必要的目標參數可設置為NULL。
使用cvSplit函數前源圖像不能設置過感興趣通道COI,否則會報錯
下面是我總結的一個獲取指定感興趣通道COI的模板demo,以備以后使用
#include <iostream> #include <cv.h> #include <cxcore.h> #include <highgui.h>int main() { // 導入一張彩色圖像(設置感興趣通道),一張灰度圖像(設置感興趣區域)IplImage* imgCOI1=cvLoadImage("lena.bmp");IplImage* imgCOI2=cvLoadImage("lena.bmp");/*OpenCV默認將讀入的圖像強制轉換為一幅三通道彩色圖像. 可以按這種方法修改讀入方式:img=cvLoadImage(fileName,flag);flag: >0 將讀入的圖像強制轉換為一幅三通道彩色圖像=0 將讀入的圖像強制轉換為一幅單通道灰度圖像<0 讀入的圖像通道數與所讀入的文件相同.*/if(!imgCOI1 || !imgCOI2)printf("Could not load image file: %s\n","lena.bmp");elseprintf("load image successful\n");cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); cvMoveWindow("mainWin", 700, 100);cvShowImage("mainWin", imgCOI1 ); printf("have a look at the color image first\nwait any key...\n");cvWaitKey(0); //設置感興趣通道為b 彩色圖像的通道順序是 BGR,所以參數指定1cvSetImageCOI( imgCOI1 ,1 );cvShowImage("mainWin", imgCOI1 ); printf("have a look at the first channel(b)of image.我們發現當使用cvShowImage時cvSetImageCOI對于感興趣通道的設置并不起作用\nwait any key...\n");cvWaitKey(0); #pragma region cvCopy方法獲取某一通道IplImage* BlueImage=cvCreateImage(cvGetSize(imgCOI1),IPL_DEPTH_8U,1); cvSetImageCOI( imgCOI1 ,3 );cvCopy(imgCOI1,BlueImage);cvShowImage("mainWin", BlueImage ); printf("have a look at the third channel(r)of image which we use cvCopy to get.\n我們發現cvCopy是支持COI的,我們抽出了紅色對應的通道\nwait any key...\n");cvWaitKey(0); #pragma endregion#pragma region cvSplit方法獲取各個通道IplImage* R_Image=cvCreateImage(cvGetSize(imgCOI2),IPL_DEPTH_8U,1); IplImage* G_Image=cvCreateImage(cvGetSize(imgCOI2),IPL_DEPTH_8U,1); IplImage* B_Image=cvCreateImage(cvGetSize(imgCOI2),IPL_DEPTH_8U,1); cvSplit(imgCOI2,B_Image,G_Image,R_Image,0); //接收各通道的子圖像要注意與源圖像的通道順序匹配,彩色即BGR。注意使用前不能設置COIprintf("have a look at the b,g,r channel in sequence which we use the cvSplit to get.\nwait any key three times...\n");cvShowImage("mainWin", B_Image ); cvWaitKey(0); cvShowImage("mainWin", G_Image ); cvWaitKey(0); cvShowImage("mainWin", R_Image ); cvWaitKey(0); #pragma endregioncvDestroyWindow("mainWin");cvReleaseImage(&imgCOI1 );cvReleaseImage(&imgCOI2);return 0; }
總結
以上是生活随笔為你收集整理的opencv感兴趣通道COI的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 探索比特币源码3-熟悉RPC接口
- 下一篇: HGE2D引擎按键消息分析