【OpenCV 例程200篇】217. 鼠标交互获取多边形区域(ROI)

OpenCV 例程200篇 总目录


【youcans 的 OpenCV 例程200篇】217. 鼠标交互获取多边形区域


函数 cv.selectROI 可以通过鼠标在图像上选择感兴趣的矩形区域(ROI,region of interest)。
如果要通过鼠标在图像上选择感兴趣的多边形区域,可以利用鼠标交互来绘制。

函数原型:

函数 cv.polylines() 用来绘制多边形曲线或多段线。
函数 cv.fillPoly() 用来绘制一个或多个填充的多边形区域。

cv.polylines(img, pts, isClosed, color[, thickness=1, lineType=LINE_8, shift=0]) → img
cv.fillPoly(img, pts, color[, lineType=LINE_8, shift=0, offset=Point()]) → img

参数说明:

  • img:输入输出图像,允许单通道灰度图像或多通道彩色图像
  • pts:多边形顶点坐标, 二维 Numpy 数组的列表
  • isClosed: 闭合标志,True 表示闭合多边形,False 表示多边形不闭合

特别注意多边形顶点坐标 pts 的格式:

  • pts 是一个列表,列表中的元素是二维 Numpy 数组,每个元素表示一组顶点坐标。
  • 二维 Numpy 数组的形状为 (m,2),每行表示多边形的一个顶点的坐标 (xi,yi),数据格式应为整型。

例如:

    points1 = np.array([[200,100], [295,169], [259,281], [141,281], [105,169]], np.int)points2 = np.array([[200,400], [259,581], [105,469], [295,469], [141,581]])

points1、points2 是形状为 (m,2) 的二维 Numpy 数组。
对于函数 cv.polylines 与 cv.fillPoly,不能直接把二维 Numpy 数组 points1 或 points2作为函数参数,而要将其作为列表的元素,如: [points1]、[points2] 或 [points1, points2]。


例程 A4.9:鼠标交互获取多边形区域(ROI)

函数 cv.selectROI 可以通过鼠标在图像上选择感兴趣的矩形区域(ROI,region of interest)。

如果要通过鼠标在图像上选择感兴趣的多边形区域,可以利用鼠标交互来绘制。

    # A4.9 鼠标交互获取多边形区域def mouseHandler(event, x, y, flags, param):  # 鼠标交互 (左键选点右键完成)global drawingsetpoint = (x, y)if event == cv.EVENT_LBUTTONDOWN:  # 鼠标左键点击事件drawing = True  # 开启绘图状态pts.append(setpoint)  # 选择多边形顶点print("选择顶点 {}:{}".format(len(pts), setpoint))elif event == cv.EVENT_RBUTTONDOWN:  # 鼠标右键点击事件drawing = False  # 结束绘图状态print("结束绘制。\n ROI 顶点坐标:")print(pts)# 鼠标交互绘制多边形 ROIimg = cv.imread("../images/imgLena.tif")  # 读取彩色图像(BGR)# 鼠标交互 ROIprint("单击鼠标左键:选择 ROI 顶点")print("单击鼠标右键:结束 ROI 选择")print("按 ESC 退出")pts = []  # ROI 顶点坐标向量drawing = True  # 开启绘图状态cv.namedWindow('origin')  # 创建图像窗口cv.setMouseCallback('origin', mouseHandler)  # 窗口与回调函数绑定while True:imgCopy = img.copy()if len(pts) > 0:cv.circle(imgCopy, pts[-1], 5, (0,0,255), -1)  # 绘制最近一个顶点if len(pts) > 1:for i in range(len(pts)-1):cv.circle(imgCopy, pts[i], 5, (0,0,255), -1)  # 绘制顶点cv.line(imgCopy, pts[i], pts[i+1], (255,0,0), 2)  # 绘制边界线段if drawing==False:cv.line(imgCopy, pts[0], pts[-1], (255,0,0), 2)  # 完成最后一段线段cv.imshow('origin', imgCopy)key = 0xFF & cv.waitKey(1)  # 按 ESC 退出if key == 27:  # Esc 退出breakcv.destroyAllWindows()  # 图像窗口points = np.array(pts, np.int)  # ROI 多边形顶点坐标集cv.polylines(img, [points], True, (255,255,255), 2)  # 在 img 绘制 ROI 多边形mask = np.zeros(img.shape[:2], np.uint8)  # 黑色掩模,单通道cv.fillPoly(mask, [points], (255,255,255))  # 多边形 ROI 为白色窗口imgROI = cv.bitwise_and(img, img, mask=mask)  # 按位与,从 img 中提取 ROIplt.figure(figsize=(9, 6))plt.subplot(131), plt.title("origin image"), plt.axis('off')plt.imshow(cv.cvtColor(img, cv.COLOR_BGR2RGB))plt.subplot(132), plt.title("ROI mask"), plt.axis('off')plt.imshow(mask, cmap='gray')plt.subplot(133), plt.title("ROI cropped"), plt.axis('off')plt.imshow(cv.cvtColor(imgROI, cv.COLOR_BGR2RGB))plt.tight_layout()plt.show()

在这里插入图片描述



【本节完】

版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/125490992)
Copyright 2022 youcans, XUPT
Crated:2022-6-26
欢迎关注 『youcans 的 OpenCV 例程 200 篇』 系列,持续更新中
欢迎关注 『youcans 的 OpenCV学习课』 系列,持续更新中

210. 绘制直线也会有这么多坑?
211. 绘制垂直矩形
215. 基于多段线绘制近似椭圆
216. 绘制多段线和多边形
217. 鼠标交互获取多边形区域

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/565379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jsoup设置元素的文本内容

修改一个HTML文档中的文本内容。 示例如下 Element div doc.select("div").first(); // <div></div> div.text("five > four"); // <div>five > four</div> div.prepend("First "); div.append(" Last&qu…

php+分针和时针重合,时钟问题—两针重合

​ 时钟问题—两针重合含义&#xff1a;钟面上的分针追上时针与之重合。这种追击&#xff0c;总是分针追时针&#xff0c;追击速度为分针每分钟前进的6度减去时针每分钟前进的0.5度&#xff0c;等于5.5度。由于钟面是圆形&#xff0c;追击分为分针在后和在前两种情况&#x…

【OpenCV 例程200篇】218. 多行倾斜文字水印

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】218. 多行倾斜文字水印 8.1 添加多行倾斜文字水印 水印是叠加在图像上的标志、签名、文本或图案&#xff0c;用于保护图像的版权。 先在黑色背景上添加图像或文字制作水印&#xff0c;再使用 cv.addWeight 函数&…

Jsoup消除不受信任的HTML(用于防止XSS的攻击)

在开发网站的时候&#xff0c;经常会提供用户评论的功能。有些不怀好意的用户&#xff0c;会搞一些脚本到评论内容中&#xff0c;而这些脚本可能会破坏整个页面的行为&#xff0c;更严重的是获取一些机要信息&#xff0c;此时需要清理该HTML&#xff0c;以避免跨站脚本cross-si…

【OpenCV 例程200篇】219. 添加数字水印(盲水印)

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】219. 添加数字水印&#xff08;盲水印&#xff09; 8.2 添加数字盲水印 数字水印&#xff0c;是指将特征信息嵌入音频、图像或是视频等数字信号中。 数字水印分为明水印和盲水印&#xff08;blind watermark&#x…

搜索栏联想词提示

在我们需要游览一些网站的时候&#xff0c;我们经常需要使用搜索引擎来进行搜索&#xff0c;无论是百度谷歌还是搜狐等&#xff0c;我们都需要在搜索栏中输入相关的搜索词&#xff0c;当我们点击进行输入的时候&#xff0c;下面会给出许许多多的提示词&#xff0c;程序自动联想…

【OpenCV 例程200篇】220.对图像进行马赛克处理

文章目录&#xff1a;『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】220.对图像进行马赛克处理 9. 图像的马赛克处理 马赛克效果是广泛使用的图像和视频处理方法。将图像中指定区域的色阶细节劣化&#xff0c;造成色块模糊的效果&#xff0c;看上…

主成分分析得分 matlab,主成分分析Matlab程序设计

PCA步骤&#xff1a;(1)对原始数据进行标准化处理(2)计算样本相关系数矩阵(3)计算相关系数矩阵R的特征值和相应的特征向量(4)选择重要的主成分&#xff0c;写出主成分表达式案例问题&#xff1a;企业综合实力排序企业综合实力评价表&#xff1a;企业序号净利润率/%固定资产利润…

【OpenCV 例程200篇】223. 特征提取之多边形拟合(cv.approxPolyDP)

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】223. 特征提取之多边形拟合 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目标…

matlab指令vpa(j10),matlab中vpa函数

Matlab中矩阵函数_IT/计算机_专业资料。Matlab中矩阵函数 矩阵转置...Matlab 中 solve 函数主要是用来求解线性方程组的解析解或者精确解。对于得 出的结果是符号变量,可以通过 vpa()得出任意位数的数值解! solve 函数的语法定义主要有......控制系统matlab常用函数的使用_计算…

Eclipse快捷键生成语句

当我们使用Eclipse进行项目的开发的时候&#xff0c;有的时候我们需要重复输入main方法和输出语句等&#xff0c;下面就教给大家如何在Eclipse开发中使用快捷键生长main方法和输出语句。 快捷键生成语句 生成main方法&#xff1a;输入"main" &#xff0c;按ALT/&…

【OpenCV 例程200篇】221.加密马赛克图像处理与解密复原

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】221.加密马赛克图像处理与解密复原 9. 图像的马赛克处理 马赛克效果是广泛使用的图像和视频处理方法。将图像中指定区域的色阶细节劣化&#xff0c;造成色块模糊的效果&#xff0c;看上去像是一个个…

小网站asp好还是php好,网站程序是asp好还是php好,哪个更利于优化?

网站程序是asp好还是php好呢&#xff1f;如果我们要做seo优化&#xff0c;哪一个又更利于优化呢&#xff1f;毕竟&#xff0c;现在在网上所看到的程序&#xff0c;是比较多的&#xff0c;选择一个好的网站程序&#xff0c;可以少走很多弯路。如果&#xff0c;大家建一个网站是为…

Java IO深入

IO体系 Java IO 体系种类繁多&#xff0c;感觉很复杂&#xff0c;但其实是 IO 涉及的因素太多了。在进行介绍的时候添加了设计模式等的使用&#xff0c;会让你感觉更加难以理解难以使用这些IO类&#xff0c;在此对java的IO做了一个详细的总结。 IO 类设计出来&#xff0c;肯定…

【OpenCV 例程200篇】222. 特征提取之弗里曼链码(Freeman chain code)

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】222. 特征提取之弗里曼链码&#xff08;Freeman chain code&#xff09; 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff…

python2与python3,Python2和Python3的10大区别

1.性能Py3.0运行pystone benchmark的速度比Py2.5慢30%。Guido认为Py3.0有极大的优化空间&#xff0c;在字符串和整形操作上可以取得很好的优化结果。2.编码Py3.0源码文件默认使用utf-8编码&#xff0c;这就使得以下代码是合法的&#xff1a;>>>中国 china>>>…

【OpenCV 例程200篇】224. 特征提取之提取骨架

OpenCV 例程200篇 总目录 【youcans 的 OpenCV 例程200篇】224. 特征提取之提取骨架 目标特征的基本概念 通过图像分割获得多个区域&#xff0c;得到区域内的像素集合或区域边界像素集合。我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目标区域。 特征通常是针…

inuri .php id=,php常用函数(遇见就补充)

preg_match()preg_match(string pattern, string subject [, array matches [, int flags]])在subject字符串中搜索与 pattern给出的正则表达式相匹配的内容。如果提供了 matches&#xff0c;则会被搜索的结果所填充。$matches[0]将包含于整个模式匹配的文本&#xff0c;$match…

【OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率

『youcans 的 OpenCV 例程200篇 - 总目录』 【youcans 的 OpenCV 例程200篇】226. 区域特征之紧致度/圆度/偏心率 特征通常是针对于图像中的某个目标而言的。 我们把感兴趣的人或物称为目标&#xff0c;目标所处的区域就是目标区域。图像分割之后&#xff0c;还要对目标区域进…

Java常见的几种设计模式

单例模式 指一个应用程序中&#xff0c;某个类的实例对象只有一个&#xff0c;你没有办法去new&#xff0c;因为构造器是被private修饰的&#xff0c;一般通过getInstance()的方法来获取它们的实例。 getInstance()的返回值是一个对象的引用&#xff0c;并不是一个新的实例&a…