您的位置:首页 > 运维架构

兴趣学习: opencv -- 视频读写, 鼠…

2016-05-19 23:25 513 查看
opencv -- 视频读写, 鼠标响应事件    
1. 今天晚上无聊, 翻了翻opencv的书, 发现一些练习题. (下面题目有跟书上稍稍改动)     2.
做ACM题做多了,
看见题目就冲动了.   
 -。-!!
 题目一: a. 创建一个程序实现以下功能: (1).
从视频文件中读入数据; (2). 将读入数据转换为灰度图.        
(3). 对图像经行边缘检测. 将三个过程处理结果显示到不同的窗口中.       
 b. 将a中的三个图像显示在一个图像窗口中.        
c. 在图像中显示文字标签.
题目二: 在题目一b的基础上, 增加鼠标点击事件, 在三幅画像中任何地方点击鼠标左键,
在图像上打印       
坐标(像素点坐标).
编译环境: qt-4.8.1, opencv 2.3.0
pro文件:
INCLUDEPATH +=
C:\OpenCV\include\opencv \
\



C:\OpenCV\lib\*.a


\

main.cpp

 
代码:
#include <cv.h>#include <highgui.h>
 
//相应鼠标的事件, 回调函数void my_mouse_callback(int event, int x, int y, int flags, void
*param){    IplImage
*img = (IplImage*) param;    switch(
event )    {    case
CV_EVENT_LBUTTONDOWN:{       
CvFont font;       
cvInitFont(&font, CV_FONT_BLACK,
1.0,1.0,0,1,8);        
char str[20];       
sprintf(str,"(%d,%d)",x,y); //坐标       
cvPutText(img, str, cvPoint(x,y), &font,
CV_RGB(250,0,0));       
cvShowImage("test5", img);       
}       
break;    }} int main(int argc, char *argv[]){    CvCapture
*capture = cvCreateFileCapture("1.avi");   
//初始化视频写结构体.    //视频的格式,
频率, 每帧大小, 是否默认彩色   
CvVideoWriter * videoWriter = cvCreateVideoWriter(               
"2.avi",               
cvGetCaptureProperty(capture, CV_CAP_PROP_FOURCC),               
cvGetCaptureProperty(capture, CV_CAP_PROP_FPS),               
cvSize(                   
(double)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH),                   
(double)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT)                   
),               
1               
);    
cvNamedWindow("test1", CV_WINDOW_AUTOSIZE);   
cvNamedWindow("test2", CV_WINDOW_AUTOSIZE);   
cvNamedWindow("test3", CV_WINDOW_AUTOSIZE);   
cvNamedWindow("test4", CV_WINDOW_AUTOSIZE);   
cvNamedWindow("test5", CV_WINDOW_AUTOSIZE);    
//5种不同的窗口, 图片帧    IplImage
*img = cvQueryFrame(capture);    IplImage
*frame = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);    IplImage
*pCanny = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);    IplImage
*h_img = cvCreateImage(               
cvSize(img->width/2,img->height/2),               
img->depth,               
img->nChannels               
);    IplImage
*image = cvCreateImage(               
cvSize(img->width*3,
img->height),               
img->depth,               
img->nChannels               
);     //创建鼠标点击,
在图像上打印坐标.   
//my_mouse_callback坐标左键点击反应回调函数.   
//image传入的参数(void *)   
cvSetMouseCallback("test5", my_mouse_callback, image);     
while(1)    {       
img = cvQueryFrame(capture);       
if(img == NULL) break;       
cvWriteFrame( videoWriter, img ); //视频写       
cvCvtColor(img, frame, CV_RGB2GRAY); //RGB ->
GRAY       
cvCanny(frame, pCanny, 50, 150, 3); // 边缘检测       
cvPyrDown(img, h_img); //图像缩小        
//将三个视频拼接在一个窗口显示.       
cvSetImageROI(image,
cvRect(0,0,img->width,img->height));
//设置关注区域       
cvCopy(img, image);       
cvResetImageROI(image);    
    cvSetImageROI(image,
cvRect(img->width,0,img->width,img->height));       
cvCvtColor(frame, image, CV_GRAY2RGB);       
CvFont font; //打印字体格式       
cvInitFont(&font, CV_FONT_BLACK,
1.0,1.0,0,1,8);       
cvPutText(image, "(Benson!!!)", cvPoint(10,50),
&font, CV_RGB(250,250,250));       
cvResetImageROI(image);        
cvSetImageROI(image,
cvRect(2*img->width,0,img->width,img->height));       
cvCvtColor(pCanny, image, CV_GRAY2RGB);       
cvResetImageROI(image);         
cvShowImage("test1", img);       
cvShowImage("test2", frame);       
cvShowImage("test3", pCanny);       
cvShowImage("test4", h_img);       
cvShowImage("test5", image);       
if( (char)cvWaitKey(33) == 27) break;    }    
cvReleaseVideoWriter(&videoWriter);   
cvReleaseImage(&img);   
cvReleaseImage(&frame);   
cvReleaseImage(&pCanny);   
cvReleaseImage(&h_img);   
cvReleaseImage(&image);   
cvDestroyAllWindows();     return
0;}
结果:

红色字体(998,177)是鼠标点击坐标值.


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: