type
status
date
slug
summary
tags
category
icon
password
Email
文章首发于我的个人博客:欢迎大佬们来逛逛
OpenCV项目源码:Github地址
鼠标交互
openCV中使用鼠标的交互的函数是:
setMouseCallback
可以使得激活对
winname
为标题的窗口进行onMouse
回调函数执行的鼠标交互操作,并且可以传递用户自定义变量给userdata
关于MouseCallBack回调函数:
- 就是一个函数指针
- 传递的参数必须一致:event鼠标点击事件,坐标,flag鼠标拖拽事件,void* 类型的param可以转为用户自定义变量。
关于event和flag的枚举类型:
- event:鼠标点击
- flag:鼠标拖拽
案例
在一张图片中左键点击画圆,右键点击画矩形。
有关如何在openCV中绘制图形请参见:
关键之处就是要有一个鼠标回调函数:
可以声明为类的静态成员函数,然后利用params进行强制转换为本类类型。
接着判断event点击的事件进行绘制即可。
然后在主程序中我们要激活这个回调函数,设置鼠标点击:
- 其中传递回调函数要使用函数指针的形式,即传递类的静态成员函数的地址。
p
表示我们需要传递自定义变量,以便在回调函数中params
转换为我们需要操作的obj
完整代码参见此Github项目
视频读写交互
使用openCV做视频操作可能不会如你想象的那么容易,因为openCV是一个强大的计算机视觉库,而不是专注于视频操作的多媒体库。
使用openCV做视频处理不能添加音频。
也许
FFmpeg
库会满足你做多媒体开发的需求。VideoCapture
类型:对视频进行读取或者打开摄像头。读取一个视频:传递给视频的文件地址即可,如果我们传递了
0
,则会打开摄像头(如果存在,否则报错)获取基本视频中的信息:
get
函数通过传递枚举类型来获取指定的信息:
例如:
视频(摄像头)转图像显示
我们加载好视频后,注意到
VideoCapture
重载了 >>
运算符,因此可以将其重定向到一张Mat上面。然后再一直显示这张Mat,就可以做到一张一张的图片显示,看起来像视频一样。
如果我们按下
ESC
则退出或者播放完成后,图片为null
了对于摄像头的转图片显示,我们只需要传递一个
VideoCapture xxx(0)
即可其他的全是一样的。视频转图片并且保存
基本操作与上类似,只不过在
imshow
的地方我们改成了保存的操作(当然你也可以一边显示一边保存)保存过程:
imwrite函数
- name:第一个参数表示保存的路径,传递前缀与文件名字与后缀来完成:
cat/1.png
- image:保存的图片
摄像头转图片并保存
如果是摄像头则我们不能用:
imwrite
有一个
VideoWriter
提供了这样的操作:通过创建一个VideoWriter类型的变量,然后通过 <<
重载往它里面写入来完成。注意
VideoWriter
的创建:- “save.avi” :表示保存的视频路径
- cv::VideoWriter::fourcc('M', 'J', 'P', 'G'):视频的解码器,MJPG表示mp4格式,点击了解更多格式
- 30:fps帧率
- cv::Size(width,height):保存的尺寸大小
- true:是否显示颜色(三通道)
具体操作如下:
滑动条交互
对于滑动条交互也是和鼠标交互类似的:
TrackbarCallback
回调函数:滑动条调整图片的亮度
涉及到对图片的像素操作
详细请看上节内容:
我们规定一个初始值:current和一个最大值:maxValue,通过调节可以调整此值:
定义:
- 一个beta表示偏移量
- alpha表示亮度的调整值
- copyMat:对一个新的Mat进行像素运算操作,否则无法还原。
对于三通道RGB来说:
- 如果我们调整为最小值:0
- 则RGB为(30,30,30)此时为黑色,因此beta就是我们的最小颜色值,即偏移量。
- 然后alpha会根据我们当前滑动条的值进行调整,变大。
- 然后执行像素运算后(xxx,xxx,xxx)就会越来越大,达到亮度提高的效果。
最后显示此图像即可。
对于此回调函数的实现:
完整代码详见Github项目源码。
openCV-learning-record
luumod • Updated Jul 6, 2023
- 作者:Yuleo
- 链接:https://www.helloylh.com/article/opencv3
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。