1.
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
void main( int argc, char** argv )
{
CvCapture* capture;
IplImage* frame;
IplImage* pImg = NULL;
IplImage* pGray = NULL;
IplImage* sGray = NULL;
IplImage* pEdge = NULL;
IplImage* sEdge = NULL;
IplImage* cEdge = NULL;
capture = cvCreateCameraCapture( 0 );
cvNamedWindow("video",CV_WINDOW_AUTOSIZE );
while (1)
{
frame = cvQueryFrame( capture );
if (!frame) break;
//解决图像颠倒的问题
cvFlip(frame,NULL,0);
pImg = cvCreateImage(
cvSize( frame->width/2, frame->height/2 ),
frame->depth,
frame->nChannels
);
pImg->origin = 1;
cvPyrDown( frame, pImg );
pGray = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);
pEdge = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,1);
cEdge = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);
sGray = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);
sEdge = cvCreateImage(cvGetSize(pImg),IPL_DEPTH_8U,3);
cvCvtColor(pImg,pGray,CV_RGB2GRAY);
cvSmooth( pGray, pEdge, CV_BLUR, 3, 3, 0, 0 );
cvNot( pGray, pEdge );
//canny边缘检测
cvCanny(pGray, pEdge, 50, 150, 3);
cvZero( cEdge );
// copy edge points
cvCopy( pImg, cEdge, pEdge );
IplImage* image = cvCreateImage(
cvSize(3*pImg->width,pImg->height),
IPL_DEPTH_8U,
3
);
cvZero( image );
cvConvertImage(pGray,sGray);
cvConvertImage(pEdge,sEdge);
cvSetImageROI(image, cvRect(0, 0, pImg->width, pImg->height));
cvCopy(pImg,image);
cvResetImageROI(image);
cvSetImageROI(image, cvRect(pImg->width, 0, pImg->width, pImg->height));
cvCopy(sEdge,image);
cvResetImageROI(image);
cvSetImageROI(image, cvRect(2*pImg->width, 0, pImg->width, pImg->height));
cvCopy(cEdge,image);
cvResetImageROI(image);
cvShowImage( "video", image );
if( cvWaitKey(10) == 27 ) break;
}
cvReleaseCapture( &capture );
cvReleaseImage( &pImg );
cvReleaseImage( &pGray );
cvReleaseImage( &pEdge );
cvReleaseImage( &cEdge );
cvReleaseImage( &sEdge );
cvReleaseImage( &sGray );
cvDestroyWindow("video");
}
转载自:http://hi.baidu.com/loop_k/blog/item/365697121d5cd2f7c2ce795d.html