OpenCV—RGB图像灰度化,并提取轮廓
主要功能:加载一个RGB彩色图像,将其转化成灰度图,并采用Canny算法提取灰度图的边缘
主要函数说明:
<1> cvCvtColor( const CvArr* src, CvArr* dst, int code )
表示将图像src的颜色空间转换后保存到图像dst中,其中code表示颜色空间转化形式,主要有CV_BGR2BGRA、CV_BGRA2BGR、CV_BGR2RGBA、CV_RGBA2BGR、CV_BGR2RGB等60种颜色空间转换形式,本程序中code为:CV_RGB2GRAY。
<2> cvCanny( const CvArr* image, CvArr* edges, double threshold1,
double threshold2, int aperture_size CV_DEFAULT(3) );
表示将图像image中阈值为thresh1至thresh2间的轮廓提取出来,并将轮廓图像保存到edges中。
<3>另外在轮廓图像中添加了一个滑动条以控制阈值范围,查看不同阈值范围内的轮廓图像。
***********************
代码如下:
// RGB_Gray_Canny.cpp : Defines the entry point for the console application.
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
#include <iostream>
using namespace std;
//声明图像IplImage指针
IplImage* pSrcImg=NULL;
IplImage* pGrayImg = NULL;
IplImage* pCannyImg = NULL;
int Thresh=50;
//滑动条响应函数
void onTrackerSlid(int thresh)
{
cvCanny(pGrayImg, pCannyImg,(float)thresh,(float)thresh*3, 3);
cvShowImage( "Canny Image", pCannyImg );
}
int main( int argc, char** argv )
{
if(argc!=2)
argv[1]="lena.jpg";
//载入图像,强制转化为Gray
if((pSrcImg = cvLoadImage( argv[1],1)) != 0 )
{
cout<<"Press ESC to Quit"<<endl;
//将颜色空间由RGB转化为Gray
pGrayImg=cvCreateImage(cvGetSize(pSrcImg),8,1);
cvCvtColor(pSrcImg,pGrayImg,CV_RGB2GRAY);
//canny边缘检测
pCannyImg = cvCreateImage(cvGetSize(pGrayImg),IPL_DEPTH_8U,1);
//cvCanny(pGrayImg, pCannyImg, 150,50, 3);
//创建窗口
cvNamedWindow( "Source Image", CV_WINDOW_AUTOSIZE);
cvNamedWindow( "Gray Image",CV_WINDOW_AUTOSIZE);
cvNamedWindow( "Canny Image",CV_WINDOW_AUTOSIZE);
//添加滑动条来调节边缘检测的阈值
cvShowImage( "Gray Image", pCannyImg);
cvCreateTrackbar("Threshold", "Canny Image", &Thresh, 100, onTrackerSlid);
onTrackerSlid(Thresh);
//显示图像
cvShowImage( "Source Image", pSrcImg );
cvShowImage( "Gray Image",pGrayImg);
//保存图像
cvSaveImage( "Gray_Image.jpg",pGrayImg);
cvSaveImage( "Canny_Image.jpg",pCannyImg);
//等待按"ESC"键退出
while(1)
if(cvWaitKey(100)==27)
break;
//销毁窗口
//cvWaitKey(0);
cvDestroyWindow( "Source Image" );
cvDestroyWindow( "Canny Image" );
cvDestroyWindow( "Gray Image");
//释放图像
cvReleaseImage( &pGrayImg );
cvReleaseImage( &pCannyImg );
cvReleaseImage( &pSrcImg);
return 0;
}
return -1;
}