兴趣学习: 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 \
代码:
#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;}
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)是鼠标点击坐标值.
相关文章推荐
- (OK)(OK) Fedora23——NS3(MANETs)——Docker(busybox)——genymotion(android)——All is OK
- 几天了,终于把Xshell连上了
- -bash: /tyrone/jdk/jdk1.8.0_91/bin/java: cannot execute binary file
- linux入门
- CentOS7 Docker Nginx部署及运行
- Linux : 线程(thread)
- Linux: 进程间通信
- Linux:内核进程 (脑里面必有…
- Linux:proc文件系统
- Linux:Qt的编译和安装配置 (本…
- Spark定制班第8课:Spark Streaming源码解读之RDD生成全生命周期彻底研究和思考
- 优化的网站注册时[验证邮箱]的流程
- Eclipse Java EE IDE for Web Developers.配置Tomcat全攻略
- Linux学习进阶路线
- Flask的大型网站模板
- shell简单使用(五)变量之二
- maven依赖关系中Scope的作用
- 学习OpenStack Mitaka单节点部署笔记
- HTML5中网站与用户进行交互的方式
- Tomcat 配置的数据源,测试连接数据库报告类转换错误