学习opencv第四章练习题
1, a)
#include <cv.h> #include <highgui.h> #include <stdio.h> IplImage* doCanny( IplImage* in, double lowThresh, double highThresh, double aperture ) { if(in->nChannels != 1) return 0;//只检测单通道灰度图像 IplImage* out = cvCreateImage( cvGetSize( in ), IPL_DEPTH_8U, 1 ); cvCanny(in,out,lowThresh,highThresh,aperture); return out; } int main(int argc,char* argv[]) { printf("读入视频,并转化为灰度图像,并进行canny检测边缘。\n"); printf("***************************************\n"); //printf("请输入视频路径:\n"); CvCapture* capture = cvCreateFileCapture( "test.flv" ); //原视频帧 IplImage* frame; //灰度视频帧 IplImage* frame_gray = cvCreateImage( cvSize( (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH ), (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT ) ), IPL_DEPTH_8U, 1 ); //canny视频帧 IplImage* frame_canny = cvCreateImage( cvSize( (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH ), (int)cvGetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT ) ), IPL_DEPTH_8U, 1 ); cvNamedWindow("原视频"); cvNamedWindow("灰度视频"); cvNamedWindow("canny 视频"); while(1) { frame = cvQueryFrame( capture ); if(!frame)break;//视频结束 cvCvtColor(frame,frame_gray,CV_BGR2GRAY); frame_canny = doCanny(frame_gray,10,100,3); cvShowImage("原视频",frame); cvShowImage("灰度视频",frame_gray); cvShowImage("canny 视频",frame_canny); if(cvWaitKey(33) == 27)break; } cvReleaseCapture(&capture); cvReleaseImage(&frame_gray); cvReleaseImage(&frame_canny); cvDestroyWindow("原视频"); cvDestroyWindow("灰度视频"); cvDestroyWindow("canny 视频"); }
b)
#include <cv.h> #include <highgui.h> #include <stdio.h> IplImage* doCanny( IplImage* in, double lowThresh, double highThresh, double aperture ) { if(in->nChannels != 1) return 0;//只检测单通道灰度图像 IplImage* out = cvCreateImage( cvGetSize( in ), IPL_DEPTH_8U, 1 ); cvCanny(in,out,lowThresh,highThresh,aperture); return out; } int main(int argc,char* argv[]) { printf("读入视频,并转化为灰度图像,并进行canny检测边缘。\n"); printf("***************************************\n"); //printf("请输入视频路径:\n"); CvCapture* capture = cvCreateFileCapture( "test.flv" ); //原视频帧 IplImage* frame = NULL; frame = cvQueryFrame(capture); int width = cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH); int heigth = cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT); //大图片 IplImage* frame_total = cvCreateImage( cvSize(width*3,heigth), IPL_DEPTH_8U, frame->nChannels ); //单通道灰度视频帧 IplImage* frame_gray = cvCreateImage( cvSize(width,heigth), IPL_DEPTH_8U, 1 ); //3通道灰度视频帧 IplImage* gray = cvCreateImage( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); //单通道canny视频帧 IplImage* frame_canny = cvCreateImage( cvSize(width,heigth), IPL_DEPTH_8U, 1 ); //3通道canny视频帧 IplImage* canny = cvCreateImage( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); //创建三个图像头 IplImage* image1 = cvCreateImageHeader( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); IplImage* image2 = cvCreateImageHeader( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); IplImage* image3 = cvCreateImageHeader( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); cvZero(frame_total); image1->origin = frame->origin; image1->widthStep = frame_total->widthStep; image1->depth = frame->depth; image1->nChannels = 3; image2->origin = frame->origin; image2->widthStep = frame_total->widthStep; image2->depth = frame->depth; image2->nChannels = 3; image3->origin = frame->origin; image3->widthStep = frame_total->widthStep; image3->depth = frame->depth; image3->nChannels = 3; cvNamedWindow("原视频"); while(1) { frame = cvQueryFrame( capture ); if(!frame)break; //视频结束 cvCvtColor(frame,frame_gray,CV_BGR2GRAY); cvCvtColor(frame_gray,gray,CV_GRAY2RGB); frame_canny = doCanny(frame_gray,10,100,3); cvCvtColor(frame_canny,canny,CV_GRAY2RGB); image1->imageData = frame_total->imageData; cvCopy(frame,image1); image2->imageData = frame_total->imageData+frame->widthStep; cvCopy(gray,image2); image3->imageData = frame_total->imageData+2*frame->widthStep; cvCopy(canny,image3); cvShowImage("原视频",frame_total); if(cvWaitKey(33) == 27)break; } cvReleaseCapture(&capture); cvReleaseImage(&frame_gray); cvReleaseImage(&frame_canny); cvReleaseImage(&gray); cvReleaseImage(&canny); cvDestroyWindow("原视频"); }
2
#include <cv.h> #include <highgui.h> #include <stdio.h> //回调函数 void my_mouse_callback(int event, int x, int y, int flags, void* param); bool click = false; char str[100]; CvPoint point; CvFont font = cvFont(10.0,0); int main(int argc,char* argv[]) { IplImage* img = cvLoadImage("12.jpg"); IplImage* temp = cvCloneImage(img); cvNamedWindow("image"); cvSetMouseCallback( "image", my_mouse_callback, (void*) img ); while(1) { cvCopy(img,temp); if(click) { cvPutText(temp,str,point,&font,cvScalar(0,255,0)); } cvShowImage("image",temp); if(cvWaitKey(15)==27)break; } return 0; } void my_mouse_callback(int event, int x, int y, int flags, void* param) { IplImage* image = (IplImage*) param; switch(event) { case CV_EVENT_MOUSEMOVE: break; case CV_EVENT_LBUTTONDOWN: { click = true; CvScalar pt = cvGet2D(image,y,x); double b = pt.val[0]; double g = pt.val[1]; double r = pt.val[2]; memset(str,0,30); point = cvPoint(x,y); sprintf(str,"R:%.0f,G:%.0f,B:%.0f",r,g,b); printf("R:%.0f,G:%.0f,B:%.0f\n",r,g,b); cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5f,0.5f,0,1); }break; case CV_EVENT_LBUTTONUP: click = false; break; } }
a)
View Code
#include <cv.h> #include <highgui.h> #include <stdio.h> void my_mouse_callback(int event, int x, int y, int flags, void* param); bool click = false; char str[100]; CvPoint point; CvFont font = cvFont(10.0,0); IplImage* doCanny( IplImage* in, double lowThresh, double highThresh, double aperture ) { if(in->nChannels != 1) return 0;//只检测单通道灰度图像 IplImage* out = cvCreateImage( cvGetSize( in ), IPL_DEPTH_8U, 1 ); cvCanny(in,out,lowThresh,highThresh,aperture); return out; } int main(int argc,char* argv[]) { printf("读入视频,并转化为灰度图像,并进行canny检测边缘。\n"); printf("***************************************\n"); //printf("请输入视频路径:\n"); CvCapture* capture = cvCreateFileCapture( "test.flv" ); //原视频帧 IplImage* frame = NULL; frame = cvQueryFrame(capture); int width = cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_WIDTH); int heigth = cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT); //大图片 IplImage* frame_total = cvCreateImage( cvSize(width*3,heigth), IPL_DEPTH_8U, frame->nChannels ); //单通道灰度视频帧 IplImage* frame_gray = cvCreateImage( cvSize(width,heigth), IPL_DEPTH_8U, 1 ); //3通道灰度视频帧 IplImage* gray = cvCreateImage( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); //单通道canny视频帧 IplImage* frame_canny = cvCreateImage( cvSize(width,heigth), IPL_DEPTH_8U, 1 ); //3通道canny视频帧 IplImage* canny = cvCreateImage( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); //创建三个图像头 IplImage* image1 = cvCreateImageHeader( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); IplImage* image2 = cvCreateImageHeader( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); IplImage* image3 = cvCreateImageHeader( cvSize(width,heigth), IPL_DEPTH_8U, 3 ); cvZero(frame_total); image1->origin = frame->origin; image1->widthStep = frame_total->widthStep; image1->depth = frame->depth; image1->nChannels = 3; image2->origin = frame->origin; image2->widthStep = frame_total->widthStep; image2->depth = frame->depth; image2->nChannels = 3; image3->origin = frame->origin; image3->widthStep = frame_total->widthStep; image3->depth = frame->depth; image3->nChannels = 3; cvNamedWindow("原视频"); IplImage* temp = cvCloneImage(frame_total); cvSetMouseCallback("原视频",my_mouse_callback,temp); while(1) { frame = cvQueryFrame( capture ); if(!frame)break; //视频结束 cvCvtColor(frame,frame_gray,CV_BGR2GRAY); cvCvtColor(frame_gray,gray,CV_GRAY2RGB); frame_canny = doCanny(frame_gray,10,100,3); cvCvtColor(frame_canny,canny,CV_GRAY2RGB); image1->imageData = frame_total->imageData; cvCopy(frame,image1); image2->imageData = frame_total->imageData+frame->widthStep; cvCopy(gray,image2); image3->imageData = frame_total->imageData+2*frame->widthStep; cvCopy(canny,image3); cvCopy(frame_total,temp); if(click) { cvPutText(temp,str,point,&font,cvScalar(0,255,0)); } cvShowImage("原视频",temp); if(cvWaitKey(33) == 27)break; } cvReleaseCapture(&capture); cvReleaseImage(&frame_gray); cvReleaseImage(&frame_canny); cvReleaseImage(&gray); cvReleaseImage(&canny); cvDestroyWindow("原视频"); } void my_mouse_callback(int event, int x, int y, int flags, void* param) { IplImage* image = (IplImage*) param; switch(event) { case CV_EVENT_MOUSEMOVE: break; case CV_EVENT_LBUTTONDOWN: { click = true; CvScalar pt = cvGet2D(image,y,x); double b = pt.val[0]; double g = pt.val[1]; double r = pt.val[2]; memset(str,0,30); point = cvPoint(x,y); sprintf(str,"R:%.0f,G:%.0f,B:%.0f",r,g,b); printf("R:%.0f,G:%.0f,B:%.0f\n",r,g,b); cvInitFont(&font,CV_FONT_HERSHEY_SIMPLEX,0.5f,0.5f,0,1); }break; case CV_EVENT_LBUTTONUP: click = false; break; } }
4
View Code
#include <cv.h> #include <highgui.h> #include <stdio.h> int g_slider_position=0; CvCapture* g_capture = NULL; int i = 0; int g_slider_position1 = 0; bool t = true; void onTrackbarSlide(int pos) { cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos); i = pos; } void switch_callback(int position) { if(position == 0) t = true; else t = false; } int main(int argc,char* argv[]) { cvNamedWindow("Video",CV_WINDOW_AUTOSIZE); g_capture = cvCaptureFromFile("test.flv"); int frame = (int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT); if(frame!=0) { cvCreateTrackbar("Position","Video",&g_slider_position,frame,onTrackbarSlide); cvCreateTrackbar("Position1","Video",&g_slider_position1,1,switch_callback); }else printf("read video wrong!\n"); cvSetTrackbarPos("Position","Video",1); cvSetTrackbarPos("Position1","Video",0); IplImage *frames; while(1) { frames=cvQueryFrame(g_capture); if(frames==NULL)break; char c = cvWaitKey(33); if(c == 27)break; cvShowImage("Video",frames); cvSetTrackbarPos("Position","Video",i); if(t) { i+=10; cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,i); }else { cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,i); } } cvReleaseCapture(&g_capture); cvDestroyWindow("Video"); return 0; }
posted on 2013-03-01 15:51 NewPanderKing 阅读(426) 评论(0) 收藏 举报

浙公网安备 33010602011771号