返回顶部
首页 > 资讯 > 后端开发 > Python >Python+OpenCV实现鼠标画瞄准星的方法详解
  • 522
分享到

Python+OpenCV实现鼠标画瞄准星的方法详解

2024-04-02 19:04:59 522人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录函数说明cv2.circle()cv2.line()简单的例子利用鼠标回调函数画瞄准星所谓瞄准星指的是一个圆圈加一个圆圈内的十字线,就像玩射击游戏狙击枪开镜的样子一样。这里并不是

所谓瞄准星指的是一个圆圈加一个圆圈内的十字线,就像玩射击游戏狙击枪开镜的样子一样。这里并不是直接在图上画一个瞄准星,而是让这个瞄准星跟着鼠标走。在图像标注任务中,可以利用瞄准星进行一些辅助,特别是回归类的任务,使用该功能可以使得关键点的标注更加精准。

关于鼠标回调函数的说明可以参考:OpenCV-python的鼠标交互操作

函数说明

import cv2后,可以分别help(cv2.circle)和help(cv2.line)查看两个函数的帮助信息:

cv2.circle()

 

其中四个必选参数:

img:底图,uint8类型的ndarray

center:圆心坐标,是一个包含两个数字的tuple(必需是tuple),表示(x, y)

radius:圆半径,必需是整数

color:颜色,是一个包含三个数字的tuple或list,表示(b, g, r)

其他是可选参数:

thickness:点的线宽。必需是大于0的整数,必需是整数,不能小于0。默认值是1

lineType:线的类型。可以取的值有cv2.LINE_4,cv2.LINE_8,cv2.LINE_AA。其中cv2.LINE_AA的AA表示抗锯齿,线会更平滑,画圆的时候使用该类型比较好。

cv2.line()

 line(img, pt1, pt2, color[, thickness[, lineType[, shift]]]) -> img
    .   @brief Draws a line segment connecting two points.
    .   
    .   The function line draws the line segment between pt1 and pt2 points in the image. The line is
    .   clipped by the image boundaries. For non-antialiased lines with integer coordinates, the 8-connected
    .   or 4-connected Bresenham alGorithm is used. Thick lines are drawn with rounding endings. Antialiased
    .   lines are drawn using Gaussian filtering.
    .   
    .   @param img Image.
    .   @param pt1 First point of the line segment.
    .   @param pt2 Second point of the line segment.
    .   @param color Line color.
    .   @param thickness Line thickness.
    .   @param lineType Type of the line. See #LineTypes.
    .   @param shift Number of fractional bits in the point coordinates.

其中四个必选参数:

img:底图,uint8类型的ndarray

pt1:起点坐标,是一个包含两个数字的tuple(必需是tuple),表示(x, y)

pt2:终点坐标,类型同上

color:颜色,是一个包含三个数字的tuple或list,表示(b, g, r)

其他是可选参数:

thickness:点的线宽。必需是大于0的整数,必需是整数,不能小于0。默认值是1

lineType:线的类型。可以取的值有cv2.LINE_4,cv2.LINE_8,cv2.LINE_AA。其中cv2.LINE_AA的AA表示抗锯齿,线会更平滑,画圆的时候使用该类型比较好。

简单的例子

# -*- coding: utf-8 -*-

import cv2
import numpy as np


def imshow(winname, image):
    cv2.namedWindow(winname, 1)
    cv2.imshow(winname, image)
    cv2.waiTKEy(0)
    cv2.destroyAllwindows()


if __name__ == '__main__':
    image = np.zeros((256, 256, 3), np.uint8)
    center = (128, 128)
    radius = 50
    color = (0, 255, 0)
    thickness = 2

    pt_left = (center[0] - radius, center[1])
    pt_right = (center[0] + radius, center[1])
    pt_top = (center[0], center[1] - radius)
    pt_bottom = (center[0], center[1] + radius)

    cv2.circle(image, center, radius, color, thickness, lineType=cv2.LINE_AA)
    cv2.line(image, pt_left, pt_right, color, thickness)
    cv2.line(image, pt_top, pt_bottom, color, thickness)
    imshow('draw_crosshair', image)

结果如下:

利用鼠标回调函数画瞄准星

操作说明:

鼠标移动时以鼠标为圆心跟随一个瞄准星

鼠标滚轮控制瞄准星的大小

+, -号控制鼠标滚轮时瞄准星的变化量

代码如下:

# -*- coding: utf-8 -*-

import cv2

WIN_NAME = 'draw_crosshair'


class DrawCrosshair(object):
    def __init__(self, image, color, center, radius, thickness=1):
        self.original_image = image
        self.image_for_show = image.copy()
        self.color = color
        self.center = center
        self.radius = radius
        self.thichness = thickness
        self.increment = 5

    def increase_radius(self):
        self.radius += self.increment

    def decrease_radius(self):
        self.radius -= self.increment
        self.radius = max(self.radius, 0)

    def increase_increment(self):
        self.increment += 1

    def decrease_increment(self):
        self.increment -= 1
        self.increment = max(self.increment, 1)

    def reset_image(self):
        """
        reset image_for_show using original image
        """
        self.image_for_show = self.original_image.copy()

    def draw_circle(self):
        cv2.circle(self.image_for_show,
                   center=self.center,
                   radius=self.radius,
                   color=self.color,
                   thickness=self.thichness,
                   lineType=cv2.LINE_AA)

    def draw_crossline(self):
        pt_left = (self.center[0] - self.radius, self.center[1])
        pt_right = (self.center[0] + self.radius, self.center[1])
        pt_top = (self.center[0], self.center[1] - self.radius)
        pt_bottom = (self.center[0], self.center[1] + self.radius)
        cv2.line(self.image_for_show, pt_left, pt_right,
                 self.color, self.thichness)
        cv2.line(self.image_for_show, pt_top, pt_bottom,
                 self.color, self.thichness)

    def draw(self):
        self.reset_image()
        self.draw_circle()
        self.draw_crossline()


def onmouse_draw_rect(event, x, y, flags, draw_crosshair):
    if event == cv2.EVENT_MOUSEWHEEL and flags > 0:
        draw_crosshair.increase_radius()
    if event == cv2.EVENT_MOUSEWHEEL and flags < 0:
        draw_crosshair.decrease_radius()

    draw_crosshair.center = (x, y)
    draw_crosshair.draw()


if __name__ == '__main__':
    # image = np.zeros((512, 512, 3), np.uint8)
    image = cv2.imread('luka.jpg')
    draw_crosshair = DrawCrosshair(image,
                                   color=(0, 255, 0),
                                   center=(256, 256),
                                   radius=100,
                                   thickness=2)
    cv2.namedWindow(WIN_NAME, 1)
    cv2.setMouseCallback(WIN_NAME, onmouse_draw_rect, draw_crosshair)
    while True:
        cv2.imshow(WIN_NAME, draw_crosshair.image_for_show)
        key = cv2.waitKey(30)
        if key == 27:  # ESC
            break
        elif key == ord('+'):
            draw_crosshair.increase_increment()
        elif key == ord('-'):
            draw_crosshair.decrease_increment()
    cv2.destroyAllWindows()

结果如下,有了瞄准星的辅助,我们可以更加精准地找到Luka的眼睛中心。同理,我们在做人脸关键点标注时,这个功能也可以让我们更加精准地找到人眼睛的中心。

到此这篇关于Python+OpenCV实现鼠标画瞄准星的方法详解的文章就介绍到这了,更多相关Python OpenCV瞄准星内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python+OpenCV实现鼠标画瞄准星的方法详解

本文链接: https://lsjlt.com/news/119895.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python+OpenCV实现鼠标画瞄准星的方法详解
    目录函数说明cv2.circle()cv2.line()简单的例子利用鼠标回调函数画瞄准星所谓瞄准星指的是一个圆圈加一个圆圈内的十字线,就像玩射击游戏狙击枪开镜的样子一样。这里并不是...
    99+
    2024-04-02
  • C#实现自定义动画鼠标的示例详解
    目录实践过程效果代码实践过程 效果 代码 public partial class Form1 : Form { public Form1() { ...
    99+
    2022-12-20
    C#自定义动画鼠标 C# 动画鼠标 C# 鼠标
  • 用Python实现流星雨效果的方法详解
    流星雨的前提是得先有一个流星,所谓流星,就是一个拖着尾巴的直线。所谓拖着尾巴,实际上是我们的浪漫想象,实质无非是尺寸和颜色的渐变罢了。 而matplotlib并不能给一条曲线映射多个...
    99+
    2024-04-02
  • Python+OpenCV实现阈值分割的方法详解
    目录一、全局阈值1.效果图2.源码二、滑动改变阈值(滑动条)1.效果图2.源码三、自适应阈值分割1.效果图2.源码3.GaussianBlur()函数去噪四、参数解释一、全局阈值 原...
    99+
    2024-04-02
  • Python OpenCV实现图片预处理的方法详解
    目录一、图片预处理1.1 边界填充(padding)1.2 融合图片(mixup)1.3 图像阈值二、滤波器2.1 均值滤波器2.2 方框滤波器2.3 高斯滤波器2.4 中值滤波2....
    99+
    2024-04-02
  • Python+Opencv实现物体尺寸测量的方法详解
    目录1、效果展示2、项目介绍3、项目搭建4、utils.py文件代码展示与讲解5、项目代码展示与讲解6、项目资源7、项目总结1、效果展示 我们将以两种方式来展示我们这个项目的效果。 ...
    99+
    2024-04-02
  • 详解OpenCV实现特征提取的方法
    目录前言1. 颜色2. 形状3. 纹理a. GLCMb.  LBP结论前言 如何从图像中提取特征?第一次听说“特征提取”一词是在 YouTube ...
    99+
    2024-04-02
  • ECharts鼠标事件的处理方法详解
    事件是用户或浏览器自身执行的某种动作,如click、mouseover、页面加载完毕后触发load事件,都属于事件。 为了记录用户的操作和行为路径,需要完成鼠标事件处理和组件交互的行...
    99+
    2024-04-02
  • Python+OpenCV实现信用卡数字识别的方法详解
    目录一、模板图像处理 二、信用卡图片预处理一、模板图像处理 (1)灰度图、二值图转化 template = cv2.imread('C:/Users/bwy/Desktop...
    99+
    2024-04-02
  • OpenCV实现简易标定板的方法
    这篇文章给大家分享的是有关OpenCV实现简易标定板的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。本文实例为大家分享了OpenCV实现简易标定板的具体代码,供大家参考,具体内容如下使用OpenCV生成标定板...
    99+
    2023-06-14
  • C++ OpenCV实现boxfilter方框滤波的方法详解
    目录box filter简单解释1. 暴力实现——四循环2. 行列分离3. 行列分离优化版代码box filter简单解释 box filter的作用很简单,...
    99+
    2022-11-13
    C++ OpenCV boxfilter盒式滤波 C++ boxfilter盒式滤波 C++ 盒式滤波
  • Qt实现打地鼠游戏的方法详解
    目录功能讲解1.确定地鼠数量2.定义游戏难易程序3.难度切换4.定时器处理总结今天与大家分享一个小游戏的实现:打地鼠 看一下实现效果吧~ 在指定的时间内打中一定数额的地鼠,否则失败...
    99+
    2022-11-13
    Qt打地鼠游戏 Qt 打地鼠 Qt 游戏
  • C# OpenCV实现形状匹配的方法详解
    1. 多角度模板匹配测试效果如下图: 图1-1  图1-2 图1-3 正负角度均可正常识别,识别角度偏差<1° 2. 下面分享一下开发过程: a). R...
    99+
    2024-04-02
  • JetpackCompose实现动画效果的方法详解
    目录概述低级别动画 APIanimate*AsState使用 Animatable 实现颜色变化效果使用 updateTransition 实现颜色和圆角动画remembe...
    99+
    2024-04-02
  • Python标准库中的logging用法示例详解
    目录1、logging的介绍2、简单用法示例3、日志级别4、打印格式的各个参数5、日志输出到指定文件6、日志回滚(按照文件大小滚动)7、日志回滚(按照时间滚动)1、logging的介...
    99+
    2024-04-02
  • Python+OpenCV读写视频的方法详解
    目录读视频,提取帧接口函数:cv2.VideoCapture()获取视频信息使用set(cv2.CAP_PROP_POS_FRAMES)读取指定帧读取函数(重点)将图像写为视频示例f...
    99+
    2024-04-02
  • Python pandas求方差和标准差的方法实例
    目录准备1.求方差 1.1对全表进行操作1.1.1求取每列的方差1.1.2 求取每行的方差1.2 对单独的一行或者一列进行操作1.2.1 求取单独某一列的方差1.2.2 求取单独某一...
    99+
    2024-04-02
  • 鼠标单击变双击的详细解决方法
    如果你的鼠标单击变成了双击,可能是由于以下几个原因:1. 鼠标设置问题:首先,你可以尝试检查一下你的鼠标设置。在Windows系统中...
    99+
    2023-09-07
    鼠标
  • AndroidFlutter实现GIF动画效果的方法详解
    目录前言交错动画机制代码实现Interval 介绍总结前言 我们之前介绍了不少有关动画的篇章。前面介绍的动画都是只有一个动画效果,那如果我们想对某个组件实现一组动效,比如下面的效果,...
    99+
    2024-04-02
  • python开发之tkinter实现图形随鼠标移动的方法
    本文实例讲述了python开发之tkinter实现图形随鼠标移动的方法。分享给大家供大家参考,具体如下: 做这个东西的时候,灵感源自于一个js效果: 两个眼睛随鼠标移动而移动 运行效果: 代码部分: ...
    99+
    2022-06-04
    鼠标 图形 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作