编程学习
🖼️C++OpenCV(3):基础交互
00 分钟
2023-7-9
2023-11-23
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” :表示保存的视频路径
  • 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
luumodUpdated Jul 6, 2023

评论
  • Twikoo
  • Valine