python opencv鼠标画点之cv2.drawMarker()函数

yizhihongxing

当我们在进行图像处理时,需要在图像上标记一些点或者用不同的形状进行标注,这时候我们就需要使用OpenCV的绘图函数了。cv2.drawMarker()是opencv中的一个绘图函数,它可以在图像上绘制指定位置的Marker,即标记点。本篇文章将详细介绍cv2.drawMarker()函数的用法,以及如何实现在opencv中用鼠标画点。

drawMarker()函数的语法和参数

cv2.drawMarker()函数的语法如下:

cv2.drawMarker(image, position, color, markerType, markerSize, thickness, line_type)

其中各参数的含义如下:

  • image:要绘制Marker的图像数组;
  • position:Marker的位置,即一个二元元组,格式为(x,y),表示Marker在图像上的横纵坐标;
  • color:Marker的颜色,即一个三元素的RGB元组;
  • markerType:Marker的类型,支持以下7种marker类型:
    • cv2.MARKER_CROSS:十字型;
    • cv2.MARKER_TILTED_CROSS:斜十字型;
    • cv2.MARKER_STAR:星型;
    • cv2.MARKER_DIAMOND:菱形;
    • cv2.MARKER_SQUARE:正方形;
    • cv2.MARKER_TRIANGLE_UP:上三角;
    • cv2.MARKER_TRIANGLE_DOWN:下三角;
  • markerSize:Marker的大小,即像素大小;
  • thickness:Marker轮廓线粗细;
  • line_type:Marker轮廓线类型,支持以下4种线型:
    • cv2.LINE_4:四联通线型,即四领域连接线型;
    • cv2.LINE_8:八联通线型,即八领域连接线型;
    • cv2.LINE_AA:反锯齿线型,即Anti-aliasing线型。

鼠标画点示例

以下将演示如何使用cv2.drawMarker()函数实现在opencv中用鼠标画点的功能。这里会给出两种不同的实现方式,一种是在静态图像上画点,一种是在摄像头实时画点。

在静态图像上画点

import cv2

def draw_circle(event, x, y, flags, param):
    global mouseX, mouseY
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.drawMarker(img, (x, y), (0, 0, 255), cv2.MARKER_STAR, 30, 2)

img = cv2.imread('test.jpg')
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_circle)

while True:
    cv2.imshow('image', img)
    k = cv2.waitKey(20) & 0xFF
    if k == 27:
        break

cv2.destroyAllWindows()

以上代码中,我们定义了一个绘图函数draw_circle(),它的作用是在指定位置画一个红色的星型Marker。然后我们通过cv2.setMouseCallback()函数将绘图函数绑定到图像上鼠标双击事件上。

在主循环中通过cv2.imshow()函数显示图像,通过cv2.waitKey()函数等待用户操作,如果用户按下ESC键则退出程序。

在实时图像上画点

import cv2

def draw_circle(event, x, y, flags, param):
    global mouseX, mouseY
    if event == cv2.EVENT_LBUTTONDBLCLK:
        cv2.drawMarker(frame, (x, y), (0, 0, 255), cv2.MARKER_STAR, 30, 2)

cap = cv2.VideoCapture(0)
cv2.namedWindow('frame')
cv2.setMouseCallback('frame', draw_circle)

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret == True:
        cv2.imshow('frame',frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

cap.release()
cv2.destroyAllWindows()

以上代码中,我们定义了一个回调函数draw_circle(),实现了在摄像头拍摄的实时画面上双击鼠标即在指定位置画一个红色的星型Marker。通过cv2.setMouseCallback()函数将该回调函数绑定到摄像头实时捕获的图像上。然后我们通过cv2.VideoCapture()函数初始化一个视频捕获器,通过cv2.imshow()函数显示捕获到的图像,并在ESC键被按下时退出程序。

总结

以上是关于python opencv鼠标画点之cv2.drawMarker()函数的完整攻略。通过本篇文章的介绍,我们可以清晰明了地了解到cv2.drawMarker()函数的语法和参数,并掌握了在静态图像和实时图像上使用该函数绘制Marker的方法。这对于图像处理有很大的帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python opencv鼠标画点之cv2.drawMarker()函数 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • Python OS模块常用函数说明

    Python 的 os 模块提供了与操作系统交互的接口,允许创建、访问和删除目录、文件等。在本文中,我们将详细介绍 os 模块中的常用函数。 os.listdir() os.listdir() 函数返回指定路径下的文件和目录清单。例如,以下示例将列出当前工作目录中的所有文件和目录: import os dir_list = os.listdir(‘.’) p…

    python 2023年5月30日
    00
  • 详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数

    详解Python3中hasattr()、getattr()、setattr()、delattr()函数及示例代码 在Python3中,有四个内置函数可以用于操作对象的属性:hasattr()、getattr()、setattr()和delattr()。这些函数可以帮助我们检查、获取、设置和删除对象的属性。本文将详细介绍这些函数的用法,并提供示例代码。 has…

    python 2023年5月15日
    00
  • pytest插件的7种用法

    下面是有关pytest 插件的 7 种用法的攻略: 1. 钩子函数 pytest 插件可以通过钩子函数来在测试用例运行过程中执行特定的代码。常见的钩子函数有 pytest_load_initial_conftests,pytest_addoption,pytest_collection_modifyitems 等。 例如,我们可以通过编写 pytest_ad…

    python 2023年5月19日
    00
  • 为什么将 html 代码打印为字符串会在 python 中输出十六进制数字?

    【问题标题】:Why does printing html code as a string give hexadecimal numbers as output in python?为什么将 html 代码打印为字符串会在 python 中输出十六进制数字? 【发布时间】:2023-04-05 00:05:01 【问题描述】: 我编写了一个 Python …

    Python开发 2023年4月6日
    00
  • pyspark 读取csv文件创建DataFrame的两种方法

    当使用PySpark处理大规模数据时,常常需要从csv格式数据中读取数据。Pyspark提供了两种常用的方法来读取csv文件并创建DataFrame,分别是使用spark.read.csv()方法和通过spark.read.format()方法指定格式的方式。下面将分别详细讲解这两种方式的使用方法和示例。 方法1:使用spark.read.csv()方法 f…

    python 2023年6月3日
    00
  • 一篇文章带你了解Python和Java的正则表达式对比

    以下是“一篇文章带你了解Python和Java的正则表达式对比”的完整攻略: 一、问题描述 Python和Java都是常用的编程语言,它们都支持正则表达式。本文将详细讲解Python和Java的正则表达式对比,以及如何在两种语言中使用正则表达式。 二、解决方案 2.1 Python和Java的正则表达式对比 Python和Java的正则表达式语法有很多相似之…

    python 2023年5月14日
    00
  • 将python包发布到PyPI和制作whl文件方式

    将Python包发布到PyPI和制作.whl文件是开发Python程序时常见的任务之一,这些工作可以帮助开发者将自己的代码分享给其他开发者并让其它人能够轻松地安装并使用自己的代码。以下是完整攻略: 1.创建Python包 在开始发布python包之前,首先要创建自己的Python包。通常,一个Python包包含一个或多个Python模块、任何必需的资源文件和…

    python 2023年6月5日
    00
  • Python 中由 yield 实现异步操作

    首先,我们需要了解协程和生成器的概念。协程指的是用户态的线程,由程序员控制,可以根据实际需求进行协作式多任务处理;而生成器是一种特殊的函数,可以将函数的执行过程分解成多段,每次返回一个值,调用方可以恢复函数执行过程,并传入新的值。 在 Python 中,我们可以通过 yield 关键字实现生成器,同时也可以将其作为协程的一种实现方式,从而实现异步操作。 下面…

    python 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部