#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace std;
int col = 0;
int row = 0;
char *str = (char *)malloc(30*sizeof(char *));
IplImage* doCanny(
IplImage* in,
int lowThresh,
int highThresh,
int aperture
){
if( in->nChannels != 1)
return(0);
IplImage* out = cvCreateImage(
cvGetSize( in ),
in->depth,
in->nChannels
);
cvCanny( in, out, lowThresh, highThresh, aperture );
return( out );
};
void my_mouse_callback( int event, int x, int y, int flags, void* param){
if( event == CV_EVENT_LBUTTONDOWN){
col = x;
row = y;
}
}
int main()
{
int thresh = 30;
CvFont font;
cvInitFont( &font, CV_FONT_HERSHEY_PLAIN, 1, 1, 0, 1, 8);
const char *AviName="MV.mp4";
const char *WindowsTitle = "Merge";
cvNamedWindow( WindowsTitle, 1);
CvCapture *capture=cvCreateFileCapture(AviName);
CvSize size = cvSize(
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT)
);
IplImage *src = cvCreateImage( size, IPL_DEPTH_8U, 3);
IplImage *dst_gray = cvCreateImage( size, IPL_DEPTH_8U, 1);
IplImage *dst_canny = cvCreateImage( size, IPL_DEPTH_8U, 1);
IplImage *dst_merge = cvCreateImage( cvSize( size.width*3, size.height), IPL_DEPTH_8U, 3);
IplImage *src_header = cvCreateImageHeader( size, IPL_DEPTH_8U, 3);
src_header->origin = dst_merge->origin;
src_header->widthStep = dst_merge->widthStep;
src_header->imageData = dst_merge->imageData;
IplImage *dst_gray_header = cvCreateImageHeader( size, IPL_DEPTH_8U, 3);
dst_gray_header->origin = dst_merge->origin;
dst_gray_header->widthStep = dst_merge->widthStep;
dst_gray_header->imageData = dst_merge->imageData + dst_merge->widthStep/3;
IplImage *dst_canny_header = cvCreateImageHeader( size, IPL_DEPTH_8U, 3);
dst_canny_header->origin = dst_merge->origin;
dst_canny_header->widthStep = dst_merge->widthStep;
dst_canny_header->imageData = dst_merge->imageData + dst_merge->widthStep*2/3;
IplImage *dst_gray_header_r = cvCreateImage( cvGetSize(dst_gray_header), dst_gray_header->depth, 1);
IplImage *dst_gray_header_g = cvCreateImage( cvGetSize(dst_gray_header), dst_gray_header->depth, 1);
IplImage *dst_gray_header_b = cvCreateImage( cvGetSize(dst_gray_header), dst_gray_header->depth, 1);
IplImage *dst_canny_header_r = cvCreateImage( cvGetSize(dst_canny_header), dst_canny_header->depth, 1);
IplImage *dst_canny_header_g = cvCreateImage( cvGetSize(dst_canny_header), dst_canny_header->depth, 1);
IplImage *dst_canny_header_b = cvCreateImage( cvGetSize(dst_canny_header), dst_canny_header->depth, 1);
while( (src = cvQueryFrame(capture)) != NULL )
{
cvCopy( src, src_header);
cvConvertImage( src, dst_gray);
cvZero(dst_gray_header);
cvSplit( dst_gray_header, dst_gray_header_r, dst_gray_header_g, dst_gray_header_b, 0);
cvCopy( dst_gray, dst_gray_header_r);
cvCopy( dst_gray, dst_gray_header_g);
cvCopy( dst_gray, dst_gray_header_b);
cvMerge( dst_gray_header_r, dst_gray_header_g, dst_gray_header_b, 0, dst_gray_header);
dst_canny = doCanny( dst_gray, thresh, 3*thresh, 3);
cvZero(dst_canny_header);
cvSplit( dst_canny_header, dst_canny_header_r, dst_canny_header_g, dst_canny_header_b, 0);
cvCopy( dst_canny, dst_canny_header_r);
cvCopy( dst_canny, dst_canny_header_g);
cvCopy( dst_canny, dst_canny_header_b);
cvMerge( dst_canny_header_r, dst_canny_header_g, dst_canny_header_b, 0, dst_canny_header);
cvPutText( dst_merge, "Color", cvPoint(315,25), &font, cvScalar( 255, 255, 255));
cvPutText( dst_merge, "Gray", cvPoint(315*3,25), &font, cvScalar( 255, 255, 255));
cvPutText( dst_merge, "Canny", cvPoint(315*5,25), &font, cvScalar( 255, 255, 255));
cvShowImage( WindowsTitle, dst_merge);
cvSetMouseCallback(
WindowsTitle,
my_mouse_callback,
(void *)dst_merge
);
cout<<"( x, y) = "<<"( "<<col<<", "<<row<<")"<<endl;
memset( str, 0, 30);
sprintf( str, "( %d, %d)",col,row);
cvPutText( dst_merge, str, cvPoint(col,row), &font, cvScalar( 0, 0, 255));
cvShowImage(WindowsTitle,dst_merge);
char c = cvWaitKey(33);
if( c == 27)
break;
}
cvReleaseCapture(&capture);
cvReleaseImage(&dst_merge);
cvReleaseImage(&src);
cvReleaseImage(&dst_gray);
cvReleaseImage(&dst_canny);
cvReleaseImageHeader(&src_header);
cvReleaseImageHeader(&dst_gray_header);
cvReleaseImageHeader(&dst_canny_header);
cvReleaseImage(&dst_gray_header_r);
cvReleaseImage(&dst_gray_header_g);
cvReleaseImage(&dst_gray_header_b);
cvReleaseImage(&dst_canny_header_r);
cvReleaseImage(&dst_canny_header_g);
cvReleaseImage(&dst_canny_header_b);
cvDestroyAllWindows();
return(0);
}
运行结果:
![第五篇 学习OpenCV之视频处理_第1张图片](http://img.e-com-net.com/image/info5/b8f427c04d764d0aa97c00ba48d091d7.jpg)