您的位置:首页 > 运维架构

【OpenCV的cvSplit函数】

2016-01-09 22:58 411 查看
分离图像通道采用函数cvSplit。

 

函数原型:void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3)

分离出来的顺序是逆序的,这个要注意。

[cpp] view
plaincopy

cvSplit(pImg,bImg,gImg,rImg,0);  

分离出来的是单通道的图,显示出来是这样的:

 

通过cvMerge合并通道实现彩色图像的显示,并且也是按照BGR的顺序来输入的。

函数原型:void cvMerge(const CvArr* src0, const CvArr* src1, const CvArr* src2, const CvArr* src3, CvArr* dst)

这里有个小问题,假如说代码是这样的:

[cpp] view
plaincopy

    cvMerge(bImg,0,0,0,pImg1);  

    cvMerge(0,gImg,0,0,pImg2);  

    cvMerge(0,0,rImg,0,pImg3);  

显示出来的图像是这样的:







再对通道进行分离的结果是这样的:

以Blue通道的为例







照理说其他通道的值应该为0的才对,也就是说应该显示为黑色,为灰色意味着灰度值不为0。为什么会这样?具体的原因要看源码了,估计是当通道指针为0的时候,该通道会附一个值,但是刚刚用printf试了下输出是0没错。这下子困惑了。暂时不管他先。

我们在通道赋值1来代替0试试看:

[cpp] view
plaincopy

for(int i=0;i<pTem->nChannels;i++)  

 {  

     value.val[0]=0x1;  

     //value.val[1]=0x1;  

     //value.val[2]=0x1;  

 }  

 for(int i=0;i<pTem->height;i++)  

 {  

     for(int j=0;j<pTem->width;j++)  

     {  

         cvSet2D(pTem,i,j,value);  

     }  

 }  

这样输出的结果就成了这:







猴哥终于被分离了


源代码:

[cpp] view
plaincopy

#include "stdafx.h"  

#include <opencv2/opencv.hpp>  

int main()  

{  

  

    IplImage* pImg;  

    IplImage *pImg1,*pImg2,*pImg3;  

    IplImage *rImg,*bImg,*gImg;  

    IplImage *pTem;  

    CvScalar value;  

  

    pImg=cvLoadImage("Baboon.jpg",CV_LOAD_IMAGE_COLOR);  

  

    pTem=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);  

  

    for(int i=0;i<pTem->nChannels;i++)  

    {  

        value.val[0]=0x1;  

        //value.val[1]=0x1;  

        //value.val[2]=0x1;  

    }  

    for(int i=0;i<pTem->height;i++)  

    {  

        for(int j=0;j<pTem->width;j++)  

        {  

            cvSet2D(pTem,i,j,value);  

        }  

    }  

    cvNamedWindow("1",CV_WINDOW_AUTOSIZE);  

  

    cvNamedWindow("2",CV_WINDOW_AUTOSIZE);  

    cvNamedWindow("3",CV_WINDOW_AUTOSIZE);  

    cvNamedWindow("4",CV_WINDOW_AUTOSIZE);  

    cvNamedWindow("5",CV_WINDOW_AUTOSIZE);  

      

    cvShowImage("1",pImg);  

  

    rImg=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);  

    bImg=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);  

    gImg=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,1);  

  

    pImg1=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,3);  

    pImg2=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,3);  

    pImg3=cvCreateImage(cvSize(pImg->width,pImg->height),pImg->depth,3);  

  

    cvSplit(pImg,bImg,gImg,rImg,0);  

      

    cvMerge(bImg,pTem,pTem,0,pImg1);  

      

    cvMerge(pTem,gImg,pTem,0,pImg2);  

    cvMerge(pTem,pTem,rImg,0,pImg3);  

      

    /* 

    cvMerge(bImg,0,0,0,pImg1); 

    cvMerge(0,gImg,0,0,pImg2); 

    cvMerge(0,0,rImg,0,pImg3); 

    */  

  

    cvSplit(pImg1,bImg,gImg,rImg,0);  

    printf("%lf",gImg->imageData[0]);  

  

    cvNamedWindow("6",CV_WINDOW_AUTOSIZE);  

    cvNamedWindow("7",CV_WINDOW_AUTOSIZE);  

    cvNamedWindow("8",CV_WINDOW_AUTOSIZE);  

      

    //cvShowImage("6",pImg1);  

  

    cvShowImage("2",rImg);  

    cvShowImage("3",bImg);  

    cvShowImage("4",gImg);  

    cvShowImage("5",pTem);  

    cvShowImage("6",pImg1);  

    cvShowImage("7",pImg2);  

    cvShowImage("8",pImg3);  

  

    cvWaitKey(0);  

}  

http://blog.csdn.net/Arthurlr/article/details/9077597
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息