草庐IT

OpenCV 鼠标绘图

徐图图不糊涂 2023-05-11 原文

1、实验目标

(1)、鼠标当笔
(2)、函数:setMouseCallback()
(3)、滑动调色板
(4)、函数cv.createTrackbar(),cv.getTrackbarPos()

2、实验步骤

(1)、安装必要的库

pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple

(2)、查看支持鼠标的操作

events = [i for i in dir(cv) if 'EVENT' in i]
print(events)


(3)、双击鼠标画出一个圆
cv2.setMouseCallback(winname, onMouse, userdata=0)
winname: 自定义的窗口名
onMouse:鼠标事件的回调函数(在发生鼠标事件时执行)
userdata:传递给回调函数的可选参数

#双击鼠标画一个圆
import numpy as np
import cv2 as cv
def draw_circle(event,x,y,flags,param):
    if event==cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img,(x,y),100,(255,0,0),-1)
img = np.zeros((512,512,3),np.uint8)#创建黑色图像
cv.namedWindow('image')#创建一个窗口
cv.setMouseCallback('image',draw_circle)#函数与窗口进行绑定
while(1):
    cv.imshow('image',img)
    if cv.waitKey(20) & 0xFF==27:
        break
cv.destroyAllWindows()


(4)、拖动鼠标绘制矩形或圆圈
回调函数包含两部分,一部分画矩形,一部分画曲线

drawing = False #默认False,按下鼠标为True
mode = True #if True,画出矩形,按'm'切换曲线
ix,iy=-1,-1
#响应鼠标函数
def draw_circle(event,x,y,flags,param):
    global ix,iy,drawing,mode
    if event == cv.EVENT_LBUTTONDOWN:#左键击下
        drawing = True
        ix,iy=x,y
        
    elif event==cv.EVENT_MOUSEMOVE:#鼠标移动
        if drawing == True:
            if mode==True:
                cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
            else:
                cv.circle(img,(x,y),5,(0,0,255),-1)
    elif event==cv.EVENT_LBUTTONUP:#左键弹起
        drawing = False
        if mode == True:
            cv.rectangle(img,(ix,iy),(x,y),(0,255,0),-1)
        else:
            cv.circle(img,(x,y),5,(0,0,255),-1)
#将函数与窗口进行绑定
img = np.zeros((512,512,3),np.uint8)
cv.namedWindow('image')
cv.setMouseCallback('image',draw_circle)
while(1):
    cv.imshow('image',img)
    k = cv.waitKey(1) & 0xFF
    #按下'm'键切换模式
    if k==ord('m'):#获得按键编码
        mode = not mode
    elif k==27:#按下ESC键退出
        break
cv.destroyAllWindows()



(5)滑动条调色板
cv.getTrackbarPos(trackbarname, winname)
第一个参数是滑动条名字,
第二个时所在窗口,
返回值是滑动条的数值。

cv.createTrackbar(“scale”, “display”, 0, 100, self.opencv_calibration_node.on_scale)
第一个参数时滑动条的名字,
第二个参数是滑动条被放置的窗口的名字,
第三个参数是滑动条默认值,
第四个参数时滑动条的最大值,
第五个参数时回调函数,每次滑动都会调用回调函数。

def nothing(x):
    pass
img = np.zeros((300,512,3),np.uint8)#创建黑色图片
cv.namedWindow('image')#创建窗口

#创建滑动条
cv.createTrackbar('R','image',0,255,draw_circle)
cv.createTrackbar('G','image',0,255,draw_circle)
cv.createTrackbar('B','image',0,255,draw_circle)

#创建开关
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch,'image',0,1,nothing)

while(1):
    cv.imshow('image',img)
    k = cv.waitKey(1) & 0xFF
    if k==27:
        break
    r = cv.getTrackbarPos('R','image')
    g = cv.getTrackbarPos('G','image')
    b = cv.getTrackbarPos('B','image')
    s = cv.getTrackbarPos(switch,'image')
#     print(r,g,b,s)
    if s==0:
        img[:] = 0
    else:
        img[:] = [b,g,r]

cv.destroyAllWindows()



(6)、鼠标绘图,使用调色板调节颜色

img = np.zeros((300,512,3),np.uint8)#创建黑色图片
cv.namedWindow('image')#创建窗口

#创建滑动条
r = cv.createTrackbar('R','image',0,255,nothing)
g = cv.createTrackbar('G','image',0,255,nothing)
b = cv.createTrackbar('B','image',0,255,nothing)
drawing = False #默认False,按下鼠标为True
ix,iy=-1,-1
#响应鼠标函数
def nothing(x):
    pass
def draw(event,x,y,flags,param):
    global ix,iy,drawing
    r = cv.getTrackbarPos('R','image')
    g = cv.getTrackbarPos('G','image')
    b = cv.getTrackbarPos('B','image')
    if event == cv.EVENT_LBUTTONDOWN:#左键击下
        drawing = True
        ix,iy=x,y
    elif event==cv.EVENT_MOUSEMOVE:#鼠标移动
        if drawing == True:
            cv.circle(img,(x,y),5,(b,g,r),-1)
    elif event==cv.EVENT_LBUTTONUP:#左键弹起
        drawing = False
        
        cv.circle(img,(x,y),5,(b,g,r),-1)

cv.setMouseCallback('image',draw)
while(1):
    cv.imshow('image',img)
    k = cv.waitKey(1) & 0xFF
    if k==27:
        break
cv.destroyAllWindows()

有关OpenCV 鼠标绘图的更多相关文章

  1. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  2. opencv 边缘检测 cv2.Canny()详解 - 2

    👨‍💻个人简介:深度学习图像领域工作者🎉总结链接:            链接中主要是个人工作的总结,每个链接都是一些常用demo,代码直接复制运行即可。包括:                    📌1.工作中常用深度学习脚本                    📌2.torch、numpy等常用函数详解                    📌3.opencv图片、视频等操作                    📌4.个人工作中的项目总结(纯干活)              链接:https://blog.csdn.net/qq_28949847/article/details/128

  3. opencv(12):cv::rectangle学习与代码演示,使用opencv画矩形/矩形框 - 2

    1cv::rectangle介绍1.1功能:        绘制一个简单的、粗的或填充的直角矩形或直角矩形框。1.2c++代码形式rectangle()[1/2]#includevoidcv::rectangle ( InputOutputArray img, Point pt1, Point pt2, constScalar& color, int thickness=1, int lineType=LINE_8, int shift=0 ) img  图像。pt1     矩形的顶点。pt2     与pt1相对的矩形的顶点。意思是pt1和pt2是对角顶点color  颜色或亮

  4. javascript - 使用鼠标绘制路径和调整大小 - 2

    我正在尝试用鼠标旋转SVG路径。Fiddle.但我对此没有什么问题,旋转原点错误当我停止旋转并再次旋转时,它是从不同的起始Angular开始的,而不是从之前的Angular开始的。不确定如何在旋转后更新circle的位置。代码在这里:varsvgns='http://www.w3.org/2000/svg';varpath=document.getElementById('path-element');varangle=0;functiongetRotationPoint(){varbRect=path.getBoundingClientRect();varrotationPoint=

  5. javascript - 任何人都可以生成 opencv.js 吗? - 2

    我无法使用以下说明生成OpenCV.js:https://docs.opencv.org/master/d4/da1/tutorial_js_setup.html我有这个错误:CMakeError:CMakewasunabletofindabuildprogramcorrespondingto"UnixMakefiles".CMAKE_MAKE_PROGRAMisnotset.Youprobablyneedtoselectadifferentbuildtool.当我尝试执行时:python./platforms/js/build_js.pybuild_js好的,伙计们!您可以从此页面的

  6. 使用OpenCV的函数hconcat()、vconcat()实现图像或矩阵的连接 - 2

    使用OpenCV的函数hconcat()、vconcat()实现图像或矩阵的连接函数hconcat()在水平方向上连接图像或矩阵;函数vconcat()在垂直方向上连接图像或矩阵。两个函数的原型和使用方法一模一样,所以在下面的函数原型介绍中,只介绍函数hconcat()的。函数hconcat()的C++原型有三种,分别如下:voidcv::hconcat(constMat*src,size_tnsrc,OutputArraydst)上面这个原型中的参数nsrc表求src数组中的图像或矩阵个数。voidcv::hconcat(InputArraysrc1,InputArraysrc2,Outpu

  7. opencv - go 的计算机视觉在我尝试下载它时出现错误 - 2

    当我使用命令时:$goget-u-dgocv.io/x/gocv我得到错误:包gocv.io/x/gocv:无法下载,/home/ariel/go是GOROOT,不是GOPATH。有关详细信息,请参阅:'gohelpgopath'我使用ubuntu18.04 最佳答案 看起来您已经将go二进制文件安装到默认GOPATH所在的位置。要么将GOPATH设置为不同的东西,要么移动你的安装。 关于opencv-go的计算机视觉在我尝试下载它时出现错误,我们在StackOverflow上找到一个类

  8. C++ opencv鼠标事件,在图像上画矩形 - 2

    文章目录使用鼠标图像上画出矩形使用鼠标图像上画出矩形opencv中常用的除了TrackBar滑动条事件,还有丰富的鼠标事件,与TrackBar类似,鼠标事件也是使用回调函数判断动作的发生,并执行相关的操作。整个行为与QT的信号与槽类似。在图像中画出矩形,需要使用setMouseCallback()和MouseCallback()函数。本文使用的头文件及命名空间:#pragmaonce#include#includeusingnamespacestd;usingnamespacecv;设置鼠标回调函数:winname:显示图像的窗口名onMouse:自定义的鼠标回调函数userdata:输入的无

  9. opencv - 在 Go 应用程序中查找内存泄漏 - 2

    我有一个简单的程序,可以从网络摄像头读取帧,并将指向它们的指针放在goroutine的channel上。另一部分从channel读取帧指针并将它们弹出到另一个队列中。这个另一个队列然后对它们进行一些额外的处理,当这个额外的处理完成时,一堆内存被分配,显然永远不会被垃圾收集。我正在努力找出原因:此函数循环读取channel外的帧:func(mr*OpenCVMotionRunner)Run()error{log.Println("Startingmotiondetection...")//inMotion:=falsewin:=opencv.NewWindow("GoOpenCV:Vid

  10. opencv - 去/OpenCV : Filter Contours - 2

    我正在使用thislibrary在Golang中编写OpenCV应用程序。我正在尝试做一些非常基本的事情,但似乎无法让它发挥作用。我只是想取一组轮廓,删除那些没有最小面积的轮廓,然后返回过滤后的结果。这是我的代码的当前状态://given*opencv.Seqandimage,drawallthecontoursfuncopencvDrawRectangles(img*opencv.IplImage,contours*opencv.Seq){forc:=contours;c!=nil;c=c.HNext(){rect:=opencv.BoundingRect(unsafe.Pointe

随机推荐