完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
将介绍OpenCV中自带组件HighGUI的简单使用。当我们在测试算法,查看算法效果的时候,需要用到可视化,动态调参的界面,也可能需要监听鼠标,键盘等的动作,这时,HighGUI就发挥大作用了,HighGUI作为OpenCV的图形化(GUI)组件,可以通过HighGUI开发一些简易的上位机。
|
|
相关推荐
5个回答
|
|
HighGUI所提供的接口类型
OpenCV的HighGUI提供了以下几种接口:
|
|
|
|
HighGUI窗口
2.1 namedWindow接口 函数原型: python3 None = cv.namedWindow(winname[, flags])C++ void cv::namedWindow(const String & winname, int flags = WINDOW_AUTOSIZE )该函数可以传入一些参数(flags)来实现窗口的一些设定。 设置选项1:窗口大小
python3 cv2.namedWindow('image_win', flags=cv2.WINDOW_NORMAL|cv2.WINDOW_FREERATIO|cv2.WINDOW_GUI_EXPANDED)C++ namedWindow("image_win", WINDOW_NORMAL|WINDOW_FREERATIO|WINDOW_GUI_EXPANDED);2.2 imshow接口 函数原型: python3 None=cv.imshow(winname, mat)C++ void cv::imshow(const String & winname,InputArray mat )在这里,调用imshow函数时,如果”image_win”这个窗口之前并没有被声明,那么会先创建一个名字叫”image_win”的窗口,然后再更新这个窗口里面的图像。 该函数具体使用如下: python3 cv2.imshow('image_win',img)C++ imshow("image_win",img)2.3 窗口销毁 该函数负责销毁窗口,但该函数对于小型项目而言,并不是很有必要,因为一般在程序结束时,会自动销毁窗口。该函数的具体使用如下: python3 cv2.destroyWindow('image_win')C++ destroyWindow("image_win") |
|
|
|
HighGUI鼠标事件监听
3.1 鼠标支持的事件 首先,鼠标支持以下事件:
将通过一个案例来了解该函数的具体使用,在该案例中,只有当鼠标在移动,并且Ctrl和鼠标左键同时按下时,才打印出相关信息: Python3: #That is actually what callback function definedef onMouse(event,x,y,flags,param): if event == cv2.EVENT_MOUSEMOVE and flags == (cv2.EVENT_FLAG_LBUTTON|cv2.EVENT_FLAG_CTRLKEY ): #Judged, then in this occasion, do something print(x) print(y) print(event) print(flags)# Set the callback functioncv2.setMouseCallback('image', onMouse)C++: //That is actually what callback function definestatic void onMouse( int event, int x, int y, int flags, void* ){ if(event==EVENT_MOUSEMOVE)&&(flags==(EVENT_FLAG_LBUTTON|EVENT_FLAG_CTRLKEY)) { //Judged, then in this occasion, do something printf("%drn",x); printf("%drn",y); printf("%drn",event); printf("%drn",flags); }}setMouseCallback("image", onMouse);在回调函数中:
|
|
|
|
HighGUI滑动条组件
将通过一个案例来演示如何使用滑动组件,在本案例中,首先通过简单案例演示滑动组件的基本使用,接着,来做一个彩色画布。 4.1 python3实现 简单案例,先演示如何使用滑动组件。 import cv2# 创建窗口cv2.namedWindow(‘image_win’)# 定义全局变量value = (0, 0, 0)# 定义回调函数def update(x): global value r_value = cv2.getTrackbarPos(‘R’,‘image_win’) g_value = cv2.getTrackbarPos(‘G’, ‘image_win’) b_value = cv2.getTrackbarPos(‘B’, ‘image_win’) value = (r_value, g_value, b_value) print(‘Update Value, value ={}’.format(value))# 创建滑动组件cv2.createTrackbar(‘R’,‘image_win’,0,255,update)cv2.createTrackbar(‘G’,‘image_win’,0,255,update)cv2.createTrackbar(‘B’,‘image_win’,0,255,update)# 设置默认值cv2.setTrackbarPos(‘R’,‘image_win’,125)cv2.setTrackbarPos(‘G’,‘image_win’,125)cv2.setTrackbarPos(‘B’,‘image_win’,125)# 等待按键按下cv2.waitKey(0)# 销毁窗口cv2.destroyAllWindows()程序运行后的GUI界面如下图所示: 《img /》 下面进阶案例,演示如何实现可变色画布 import cv2import numpy as npcanvas = np.zeros((300,300,3), np.uint8)color = (0, 0, 0)# 更新图片,在更新颜色回调函数中调用def updateImage(): global color canvas[:,:] = color cv2.imshow(‘image’,canvas)# 更新颜色回调函数def updateColor(x): global color r_value = cv2.getTrackbarPos(‘Channel_Red’,‘image’) g_value = cv2.getTrackbarPos(‘Channel_Green’,‘image’) b_value = cv2.getTrackbarPos(‘Channel_Blue’,‘image’) color = (b_value,g_value,r_value) print(‘Update Value, value={}’.format(color)) updateImage()# 新建窗口cv2.namedWindow(‘image’)# 创建滑条,并设置回调函数cv2.createTrackbar(‘Channel_Red’,‘image’,0,255,updateColor)cv2.createTrackbar(‘Channel_Green’,‘image’,0,255,updateColor)cv2.createTrackbar(‘Channel_Blue’,‘image’,0,255,updateColor)# 设置滑条初始化位置cv2.setTrackbarPos(‘Channel_Red’,‘image’,125)cv2.setTrackbarPos(‘Channel_Green’,‘image’,125)cv2.setTrackbarPos(‘Channel_Blue’,‘image’,125)print(“进入RGB滑块实验, 键盘摁q退出程序”)# 首次初始化窗口的色块# 后面的更新 都是由getTrackbarPos产生变化而触发updateImage()while cv2.waitKey(0) != ord(‘q’): continuecv2.destroyAllWindows()程序运行后,运行结果如下图所示,拖动滑动条即可进行调色: 《img /》 4.2 C++实现 其C++实现如下所示,其中像素点的操作没有Python中Numpy的操作那么便捷,采用的是容器访问像素点。 #include《iostream》#include《opencv2/opencv.hpp》#include《opencv2/highgui/highgui.hpp》#include《opencv2/imgproc/imgproc.hpp》#define WINDOW_NAME “image”using namespace std;using namespace cv;int r_value = 125;int g_value = 125;int b_value = 125;Mat canvas(300,300,CV_8UC3,Scalar(125,125,125));void updateColor(int, void *){ for(int row=0; row 《 canvas.rows; row++) { for(int col = 0; col 《 canvas.cols; col++) { canvas.at《Vec3b》(row,col)[0] = (unsigned char)b_value; canvas.at《Vec3b》(row,col)[1] = (unsigned char)g_value; canvas.at《Vec3b》(row,col)[2] = (unsigned char)r_value; } } imshow(WINDOW_NAME,canvas);}int main(){ namedWindow(WINDOW_NAME, WINDOW_NORMAL|WINDOW_FREERATIO); imshow(WINDOW_NAME,canvas); createTrackbar(“Channel_Red”, WINDOW_NAME, &r_value,255,updateColor); createTrackbar(“Channel_Green”, WINDOW_NAME, &g_value,255,updateColor); createTrackbar(“Channel_Blue”, WINDOW_NAME, &b_value,255,updateColor); waitKey(); return 0;} |
|
|
|
用滑条模拟按键
在OpenCV中,按键组件是不存在的,一种比较主要的实现按键的方法是采用滑条组件来实现按键。 首先演示其实现的Python代码 import cv2cv2.namedWindow('image_win')def do_something(): print('Button Pressed!!') print('Do Something')def update(x): if x == 1: do_something() cv2.waitKey(500) cv2.setTrackbarPos('button', 'image_win', 0)cv2.createTrackbar('button','image_win',0,1,update)cv2.waitKey(0)cv2.destroyAllWindows()其相应的实现效果如下图所示: 相应的,其C++代码如下所示: #include |
|
|
|
只有小组成员才能发言,加入小组>>
692 浏览 0 评论
1106 浏览 1 评论
2473 浏览 5 评论
2808 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2646 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
653浏览 9评论
649浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
781浏览 6评论
628浏览 5评论
668浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 04:23 , Processed in 1.162988 second(s), Total 86, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号