【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
函数原型: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
相关文章推荐
- python中使用OpenCV进行人脸检测的例子
- opencv 做人脸识别 opencv 人脸匹配分析
- 使用opencv拉伸图像扩大分辨率示例
- 基于C++实现kinect+opencv 获取深度及彩色数据
- OpenCV 2.4.3 C++ 平滑处理分析
- 利用Python和OpenCV库将URL转换为OpenCV格式的方法
- python结合opencv实现人脸检测与跟踪
- Python实现OpenCV的安装与使用示例
- 在树莓派2或树莓派B+上安装Python和OpenCV的教程
- opencv-python学习一--人脸检测
- 在Ubuntu上安装OpenCV3.0和Python-openCV的经历
- OpenCV配置,从来没有这么简单!
- ubuntu下opencv和qt的安装配置
- OpenCV学习笔记(二十五)——OpenCV图形界面设计Qt+VS2008
- 分享一些OpenCV实现立体视觉的经验
- 关于OpenCv图像变换与基本图形检测
- "应用程序正常初始化失败"-0xc0150002 解决办法
- OpenCV->HSV色彩空间
- opencv 内存泄露
- OpenCV函数cvFindContours