灰度化处理图像
主要用到
plImage* cvCreateImage( CvSize size, int depth, int channels )
相当于如下的步骤:
header = cvCreateImageHeader(size,depth,channels);
cvCreateData(header);
具体的代码如下:
#include "cv.h"
#include "highgui.h"
int main( int argc, char** argv )
{
IplImage* pImg; //声明图像结构体
if( argc == 3 &&(pImg = cvLoadImage( argv[1], 0)) != 0 )
{
IplImage* pImg2 = cvCreateImage(cvGetSize(pImg),pImg->depth,pImg->nChannels);//强制转换为Gray
cvCopy(pImg, pImg2, NULL);//指针重定向
cvSaveImage(argv[2], pImg2);//存入图像
cvNamedWindow( "Image", 1 );//命名显示窗口
cvShowImage( "Image", pImg );//显示图像
cvWaitKey(0); //程序暂停,等待用户触发一个按键动作
cvDestroyWindow( "Image" );//销毁窗口
cvReleaseImage( &pImg ); //释放图片占有的内存
return 0;
}
return -1;
}
编译:
g++ -ggdb `pkg-config opencv --cflags --libs` gray.c -o gray
执行 :
./gray ../picture/lena.jpg gray.jpg
原图:
效果图:
边缘检测:
使用到的函数为:
void cvCanny( const CvArr* image, CvArr* edges, double threshold1, double threshold2, int aperture size=3 );
各参数的含义如下:
image 单通道输入图像.
edgee 单通道存储边缘的输出图像
threshold1 第一个阈值
threshold2 第二个阈值
aperture_size Sobel 算子内核大小
函数 cvCanny 采用 CANNY 算法发现输入图像的边缘而且在输出图像中标识这些边缘。threshold1和threshold2 当中的小阈值用来控制边缘连接,大的阈值用来控制强边缘的初始分割。cvCanny只接受单通道图像作为输入,故载入图像时,cvLoadImage(SRC,iscolor),第二个参数必须设为0.
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
int main( int argc, char** argv )
{
//初始化图像指针
IplImage* pImg = NULL;
IplImage* pCannyImg = NULL;
if( argc == 2 &&(pImg =cvLoadImage(argv[1], 0)) != 0 )//选择单通道输入
{
pCannyImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);
//对图像进行边缘检测
cvCanny(pImg, pCannyImg, 50, 150, 3);
//命名窗口
cvNamedWindow("src", 1);
cvNamedWindow("canny",1);
//显示
cvShowImage( "src", pImg );
cvShowImage( "canny", pCannyImg );
cvWaitKey(0);
cvDestroyWindow( "src" );
cvDestroyWindow( "canny" );
cvReleaseImage( &pImg );
cvReleaseImage( &pCannyImg );
return 0;
}
return -1;
}
编译:
g++ -ggdb `pkg-config opencv --cflags --libs` canny.c -o canny
执行 :
./canny ../../../../../Pictures/wolf.jpg
效果图:
轮廓检测
函数模型如下:
int cvFindContours( CvArr* image, CvMemStorage* storage,CvSeq** first contour, int header size=sizeof(CvContour),int mode=CV RETR LIST, int method=CV CHAIN APPROX SIMPLE,CvPoint offset=cvPoint(0,0) );
测试代码如下:
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
int main( int argc, char** argv )
{
//初始化指针
IplImage* pImg = NULL;
IplImage* pContourImg = NULL;
CvMemStorage * storage = cvCreateMemStorage(0);
CvSeq * contour = 0;
int mode = CV_RETR_EXTERNAL;
if( argc == 3)
if(strcmp(argv[2], "all") == 0)
mode = CV_RETR_CCOMP; //ÄÚÍâÂÖÀª¶¼¼ì²â
cvNamedWindow("src", 1);
cvNamedWindow("contour",1);
if( argc >= 2 && (pImg = cvLoadImage( argv[1], 0)) != 0 )
{
cvShowImage( "src", pImg );
pContourImg = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);
//copy source image and convert it to BGR image
cvCvtColor(pImg, pContourImg, CV_GRAY2BGR);
cvFindContours( pImg, storage, &contour, sizeof(CvContour),mode, CV_CHAIN_APPROX_SIMPLE);
}
else
{
cvDestroyWindow( "src" );
cvDestroyWindow( "contour" );
cvReleaseMemStorage(&storage);
return -1;
}
cvDrawContours(pContourImg, contour, CV_RGB(0,0,255), CV_RGB(255, 0, 0),2, 2, 8);
cvShowImage( "contour", pContourImg );
cvWaitKey(0);
cvDestroyWindow( "src" );
cvDestroyWindow( "contour" );
cvReleaseImage( &pImg );
cvReleaseImage( &pContourImg );
cvReleaseMemStorage(&storage);
return 0;
}
编译运行后的效果如下图: