国外做网站用的程序,网络设计课程中对网页设计的报告,通信工程企业网站建设,上海网站设计与制opencv中设置和获取感兴趣通道COI的函数如下#xff1a;
SetImageCOI 设置感兴趣通道
void cvSetImageCOI( IplImage* image, int coi );
image 图像头.
coi 感兴趣通道.
函数 cvSetImageCOI 基于给定的值设置感兴趣的通道。值 0 意味着所有的通道都被选定, 1 意味着第…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* imgCOI1cvLoadImage(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* maskNULL ); 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.hint main()
{ // 导入一张彩色图像设置感兴趣通道一张灰度图像设置感兴趣区域IplImage* imgCOI1cvLoadImage(lena.bmp);IplImage* imgCOI2cvLoadImage(lena.bmp);/*OpenCV默认将读入的图像强制转换为一幅三通道彩色图像. 可以按这种方法修改读入方式:imgcvLoadImage(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 channelbof image.我们发现当使用cvShowImage时cvSetImageCOI对于感兴趣通道的设置并不起作用\nwait any key...\n);cvWaitKey(0); #pragma region cvCopy方法获取某一通道IplImage* BlueImagecvCreateImage(cvGetSize(imgCOI1),IPL_DEPTH_8U,1); cvSetImageCOI( imgCOI1 ,3 );cvCopy(imgCOI1,BlueImage);cvShowImage(mainWin, BlueImage ); printf(have a look at the third channelrof image which we use cvCopy to get.\n我们发现cvCopy是支持COI的我们抽出了红色对应的通道\nwait any key...\n);cvWaitKey(0); #pragma endregion#pragma region cvSplit方法获取各个通道IplImage* R_ImagecvCreateImage(cvGetSize(imgCOI2),IPL_DEPTH_8U,1); IplImage* G_ImagecvCreateImage(cvGetSize(imgCOI2),IPL_DEPTH_8U,1); IplImage* B_ImagecvCreateImage(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;
}