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