首页 > 其他分享 >图像入门3

图像入门3

时间:2023-05-28 14:12:23浏览次数:42  
标签:iy 鼠标 img cv 图像 circle event 入门

图像识别3

0. 序章

​ 从本章起,我们的OpenCV将会插入一段美好而虚空的幻想故事……请各位勇士进入幻境,开始你们的学习之旅。

1. 大纲

1、处理OpenCV中鼠标事件

2、学习以鼠标作为画笔,如cv.setMouseCallback()函数

2. 使用鼠标作为画笔

1)鼠标回调函数

​ 在遥远的圣彼得堡,住着一位美丽动人的公主——Libeaka,许多勇士都慕名而来,想要求娶这位美丽的公主,但是这位公主非常喜欢OpenCV,她希望嫁给一位精通OpenCV的勇士。面对这crush,你暗自下定决心,要学好OpenCV……

​ 公主的第一个心结是要求各位勇士用鼠标作为画笔绘制出一个填充的矩形……愚蠢的你不知道该从何下手,于是你求助到了正在学OpenCV的我,我看在你情真意切,决定告诉你怎么做。

​ 我们想要创建一个简单的应用程序,使得无论我们在屏幕上哪里双击一下,屏幕上都会绘制出一个圆形。我们需要创建一个鼠标回调函数,该函数在发生鼠标事件时执行。鼠标事件可以是与鼠标相关的任何事务,例如鼠标键按下,并返回点击位置的x,y值。

# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
    双击后在双击位置绘制圆形
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img, (x, y), 100, (56, 212, 136), -1)


​ 然而,我们的目标似乎更加远大,不止满足于此,这会让你在公主面前疯狂加分。我们希望我们能够通过拖动鼠标来绘制矩形或者圆形,所以我们应该监控鼠标upDOWNMOVE三种状态,这些可以用于目标跟踪,图像分割地图等方面。

# 鼠标回调函数
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:
            if mode:
                cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1, lineType=cv.LINE_AA)
            else:
                cv.circle(img, (x, y), 5, (0, 0, 255), -1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode:
            cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 3)
        else:
            cv.circle(img, (x, y), 5, (0, 0, 255), -1)


​ 贪心的Libeaka公主显然不止满足于此,她想要用鼠标绘制出未填充的矩形。即使是我,我也需要想想再告诉你,那么,聪明的勇士,你能自己想出来这个问题的答案嘛?(答案见完整代码部分)

3. 附完整代码

​ 用鼠标移动绘制填充矩形,完整代码如下:

import cv2 as cv
import numpy as np

drawing = False     # 如果按下鼠标,则为真
mode = True     # 如果为真,绘制矩形。按M键可以切换到曲线
ix, iy = -1, -1


# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
    """
    双击后在双击位置绘制圆形
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img, (x, y), 100, (56, 212, 136), -1)
    """
    global ix, iy, drawing, mode
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing:
            if mode:
                cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1, lineType=cv.LINE_AA)
            else:
                cv.circle(img, (x, y), 5, (0, 0, 255), -1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode:
            cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 3)
        else:
            cv.circle(img, (x, y), 5, (0, 0, 255), -1)


if __name__ == "__main__":
    # 创建一个黑色的图像,一个窗口,并绑定到窗口功能
    img = np.zeros((512, 512, 3), np.uint8)
    cv.namedWindow('image')
    # 回调
    cv.setMouseCallback('image', draw_circle)
    while(1):
        cv.imshow('image', img)
        # 按ESC窗口被强制关闭
        if cv.waitKey(20) & 0xFF == 27:
            break
    cv.destroyAllWindows()

​ 用鼠标移动绘制未填充矩形,完整代码如下:

import cv2 as cv
import numpy as np

drawing = False     # 如果按下鼠标,则为真
mode = True     # 如果为真,绘制矩形。按M键可以切换到曲线
ix, iy = -1, -1


# 鼠标回调函数
def draw_circle(event, x, y, flags, param):
    """
    双击后在双击位置绘制圆形
    if event == cv.EVENT_LBUTTONDBLCLK:
        cv.circle(img, (x, y), 100, (56, 212, 136), -1)
    """
    global ix, iy, drawing, mode
    if event == cv.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y
    elif event == cv.EVENT_MOUSEMOVE:
        if drawing:
            if mode:
                cv.rectangle(img, (0, 0), (640, 480), (0, 0, 0), -1)
                cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1, lineType=cv.LINE_AA)
            else:
                cv.circle(img, (x, y), 5, (0, 0, 255), -1)
    elif event == cv.EVENT_LBUTTONUP:
        drawing = False
        if mode:
            cv.rectangle(img, (ix, iy), (x, y), (0, 255, 0), 1)
        else:
            cv.circle(img, (x, y), 5, (0, 0, 255), -1)


if __name__ == "__main__":
    # 创建一个黑色的图像,一个窗口,并绑定到窗口功能
    img = np.zeros((512, 512, 3), np.uint8)
    cv.namedWindow('image')
    # 回调
    cv.setMouseCallback('image', draw_circle)
    while True:
        cv.imshow('image', img)
        # 按ESC窗口被强制关闭
        if cv.waitKey(20) & 0xFF == 27:
            break
    cv.destroyAllWindows()

标签:iy,鼠标,img,cv,图像,circle,event,入门
From: https://www.cnblogs.com/chickchick/p/17438193.html

相关文章

  • TS 从入门到深度掌握,晋级TypeScript高手
    TS从入门到深度掌握,晋级TypeScript高手download:3wzxit666comRN从0到1系统精讲Part1:环境搭建ReactNative是一种基于React的开源框架,可以用JavaScript来编写原生移动应用程序。本文将详细介绍如何从零开始学习和使用ReactNative。安装必要软件首先,我们需要安装Node.js和npm......
  • WPF入门教程系列二十六——DataGrid使用示例(3)
    WPF入门教程系列目录WPF入门教程系列二——Application介绍WPF入门教程系列三——Application介绍(续)WPF入门教程系列四——Dispatcher介绍WPF入门教程系列五——Window介绍WPF入门教程系列十一——依赖属性(一)WPF入门教程系列十五——WPF中的数据绑定(一) 五、DataGr......
  • k8s-Pod调度策略(入门攻略)
    首先在k8s中,k8s会根据每个work节点的配置,负载差异,自动生成优选函数,根据优选函数,当master节点分配下来任务时,将pod分配带最适合运行的node节点上。之外我们技术人员还有以下三种方式去影响我们的pod调度,node节点调度器亲和性调度污点容忍度区别和实例操作一.node节点调度是最直接的......
  • Tengine 入门实战(1)--简介及安装
    1、简介Tengine是由淘宝网发起的Web服务器项目。它在Nginx的基础上,针对大访问量网站的需求,添加了很多高级功能和特性。Tengine的性能和稳定性已经在大型的网站如淘宝网,天猫商城等得到了很好的检验。它的最终目标是打造一个高效、稳定、安全、易用的Web平台。Tengine特......
  • 图像入门2
    图像入门21.大纲1、使用OpenCV绘制不同的几何形状2、学习以下功能:cv.line(),cv.circle(),cv.rectangle(),cv.sllipse(),cv.putText()等2.常见参数img:绘制形状的图像color:形状的颜色,作为元组传递厚度:线或圆等的粗细。对闭合图形传递-1,填充形状,默认厚度为1lineType:线的类......
  • 二分图和 2-SAT 问题入门
    二分图定义通俗的说,就是一个图可以分成两个部分,两个部分内部没有连接的边,所有的边都在两个部分之间。比如这就是一张二分图。可以发现,A,B集合中各自是没有边连接的,边都连在了AB集合之间。并且4是独立的,所以其实我们把它归到集合A中或者集合B中都可以。判断二分图就......
  • 【计算机视觉】---平滑图像
    简介计算机视觉中平滑图像的原理是通过一系列的图像处理操作,对图像中的噪声进行抑制和去除,以达到平滑图像的效果。平滑图像的主要目的是减少图像中的细节和噪声,以便更好地进行后续的图像分析和处理。均值滤波:平滑图像的一种常见方法是通过邻域操作对每个像素周围的像素进行处理。常......
  • HTML入门笔记1
    一、HTML是谁发明的?1990年TimBernersLee发明了www(worldwideweb万维网),为了方面人们于阅读网页,与此同时自己又发明了HTML、HTTP、URL;用自己写的浏览器去访问自己写的服务器,这就是如今人们上网访问网页的起源和雏形。二、HTML起手应该写甚么?三、常用的表章节的标签h1-h6......
  • 渗透测试分析 ---- xxe实体注入入门
    因为我对xxe知之甚少,所以使用chatgpt帮忙翻译了一下效果十分优秀,当xml解析器解析了这句话就会取出外部数据 ......
  • Java入门10(IO流)
    IO流(input/output)​ 数据运输的载体或者中间键字节流输入字节流(FileInputStream)​ 以字节为最小单元,读取任何类型的文件,但是要注意字符集类型的转换。publicstaticvoidtestFileInputStream(){//获取文件对象Filef=newFile("文件绝对路径balabala");//......