OpenCV 画箭头 python
openCV画箭头函数arrowedLine画出来的很丑,自己写了一个画箭头函数,结果如下
1、OpenCV 画箭头的函数
if __name__ == "__main__":path = r"D:\cycFeng\Data\tree3.jpg"img = cv2.imread(path)StartX = 640StartY = 528EndX = 368EndY = 426cv2.arrowedLine(img, (StartX, StartX), (EndX, EndY), (255, 0, 0), 2, 9, 0, 0.3) # 画箭头cv2.imshow('q', img)cv2.waitKey()
cv2.arrowedLine(img, (StartX, StartX), (EndX, EndY), (255, 0, 0), 2, 9, 0, 0.3) # 画箭头
画出来效果如下,比较丑
2、自己写一个画箭头函数,
给定起始点和终点,以及颜色,先找到箭头的7个点,之后用透明掩膜在原图上画出透明箭头
"""@Author : XiaoZhou@Time : 2021/11/22 16:38@FileName : ArrowDraw.py@Function :
"""
import numpy as np
import cv2def GetArrowPoints(StartX, StartY, EndX, EndY, Width, NoseWidth, ArrowSizeL):"""这里返回一个箭头的五个点,X坐标水平向右, Y坐标垂直向下:param StartX: 开始点的X坐标:param StartY: 开始点Y的坐标:param EndX: 结束点X的坐标:param EndY: 结束点Y的坐标:param Width: 箭头尾部的宽度,这里宽度是一半:param NoseWidth: 箭头鼻翼的宽度,也是一半:param ArrowSizeL: 这里是箭头的长度:return:"""xx = EndX - StartX # 水平向右是X 竖直向下是Yyy = EndY - StartYif xx == 0: # 找到角度angle = np.pi/2else:angle = np.arctan(abs(yy / xx)) if xx < 0 and yy < 0: # 第二象限angle = np.pi + angleelif xx < 0 and yy > 0: # 第三象限angle = np.pi - angleelif xx > 0 and yy < 0: # 第一象限angle = np.pi * 2 - angled1 = Width # 这里的宽度表示线条的宽度的一半# ArrowSizeL = 50 # 表示末端箭头长度# 通过这五个点,确定一个箭头d2 = d1 + NoseWidth # 箭头线段宽度+鼻翼宽度 这里鼻翼宽度是一半箭头的鼻翼的宽度SinAngle = np.sin(angle)CosAngle = np.cos(angle)A = [int(StartX + d1 * SinAngle), int(StartY - d1 * CosAngle)]B = [int(StartX - d1 * SinAngle), int(StartY + d1 * CosAngle)]EndMid = [int(EndX - ArrowSizeL * CosAngle), int(EndY - ArrowSizeL * SinAngle)]C = [int(EndMid[0] + d1 * SinAngle), int(EndMid[1] - d1 * CosAngle)]D = [int(EndMid[0] - d1 * SinAngle), int(EndMid[1] + d1 * CosAngle)]E = [int(EndMid[0] + d2 * SinAngle), int(EndMid[1] - d2 * CosAngle)]F = [int(EndMid[0] - d2 * SinAngle), int(EndMid[1] + d2 * CosAngle)]pts = np.array([A, C, E, [EndX, EndY], F, D, B]) # 这里是有顺序的return ptsdef ArrowDrow(img, StartX, StartY, EndX, EndY, r, g, b):"""给一张图像,和箭头的起始点,和颜色,可以在图上对应位置添加对应颜色的箭头, 并且可以调节透明度:param img:图像:param StartX:起始点:param StartY::param EndX::param EndY::param r,g,b: 箭头的颜色:return:"""# 图像的宽高h = len(img)w = len(img[0])# 生成一个同样大小的掩膜图像mask1 = np.zeros((h, w), dtype=np.uint8)# 设置箭头的参数Width = 10 # 没有箭头一端的宽度的一半NoseWidth = 20 # 箭头鼻翼的宽度ArrowSizeL = 30 # 箭头的长度# 得到箭头的五个点pts = GetArrowPoints(StartX, StartY, EndX, EndY, Width, NoseWidth, ArrowSizeL)# 在掩膜mask1上用线画箭头cv2.polylines(mask1, [pts], True, (255, 255, 255)) # 这里表示True是画闭合曲线# 找到箭头的轮廓,并在原图上画contours, hierarchyNext10 = cv2.findContours(mask1, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) # 只找外轮廓# 保存原图img2 = img.copy()# 在img原图上添加带颜色的箭头for cnt in contours:cv2.fillPoly(img, [cnt], (r, g, b))# 在图像上覆盖透明膜alpha = 0.4 # 透明指数 越大颜色越重img2 = cv2.addWeighted(img, alpha, img2, 1 - alpha, 0)# # 画起始位置# img2 = cv2.circle(img2, (StartX, StartY), 5, (0, 0, 255), 1)# img2 = cv2.circle(img2, (EndX, EndY), 5, (0, 0, 255), 1)return img2if __name__ == "__main__":path = r"D:\tree3.jpg"img = cv2.imread(path)StartX = 640StartY = 528EndX = 368EndY = 426# cv2.arrowedLine(img, (StartX, StartX), (EndX, EndY), (255, 0, 0), 2, 9, 0, 0.3) # 画箭头img = ArrowDrow(img, StartX, StartY, EndX, EndY, 255, 0, 0)cv2.imshow('q', img)cv2.waitKey()
画出来的图像如下:
OpenCV 画箭头 python相关推荐
- 【opencv】3.在一个opencv窗口中显示多个视频界面、画箭头、画掉头箭头
1.在一个opencv窗口中显示不同视频界面 /** * @brief 在一个opencv窗口win_name中显示不同视频界面 * @param img_1 和 img_2 是分别是取自不同视频中的 ...
- python画箭头表示风速风向_python画风羽及风羽定义
basemap使用手册:链接:https://pan.baidu.com/s/1CUgQcsuYMbJAdCuij4WsLQ 提取码:aw16 如果想用箭头画风场,请看另一篇python matplo ...
- Python 用 OpenCV 画椭圆 (5)
利用 OpenCV 自带的 ellipse() 函数画椭圆 并显示,其函数声明如下: cv2.ellipse(img, center, axes, rotateAngle, startAngle, e ...
- 在OpenCV里用arrowedLine画箭头图形
经常使用OpenCV来做项目,就发现有更多的需求,比如像下图中使用箭头来指示: 看到白色的箭头来标记目标物体,这样才会让大家看东西更加具体化,更加形象化,特别用在教育领域,想让学生看到目标区域,使用箭 ...
- Python OpenCV画圆
Python OpenCV画圆 PS: 也是从网上各个帖子中学习的Python,因此代码的格式以及内容有粘贴网上其他大神的代码,如有侵权请告知删除 在图片中检测圆,并进行标注 #!/usr/bin/p ...
- python matplotlib quiver——画箭头、风场
如果想用风羽画风场,请看另一篇python画风羽及风羽定义 目录 用像素点坐标画图 用经纬度坐标画图(推荐) PS:三维箭头可参考: https://matplotlib.org/mpl_toolki ...
- python画箭头opencv_OpenCV绘制箭头线
OpenCV绘制箭头线 可以使用imgproc类的arrowedLine()方法在图像上绘制箭头线. 以下是这种方法的语法 - arrowedLine(Mat img, Point pt1, Poin ...
- 用python画花瓣-Python竟能画这么漂亮的花,帅呆了(代码分享)
阅读本文大概需要3分钟 关于函数和模块讲了这么久,我一直想用一个好玩有趣的小例子来总结一下,同时也作为实战练习一下. 趣味编程其实是最好的学习途径,回想十几年前我刚毕业的时候,第一份工作就给手机上写a ...
- opencv画直线,矩形
opencv 画直线要画一条线,你只需要告诉函数这条线的起点和终点.我们下面会画一条从左上方到右下角的蓝色线段. import numpy as np import cv2# Create a bla ...
最新文章
- HTML文本错位,DIV+CSS网页错位诊断和解决方法
- 全球及中国矿棉板行业运营能力状况与十四五规模预测报告2022年
- tensorflow随笔-队列管理器QueueRunner-生产者与消费者
- Informatica bulk与normal模式的深入详解(转)
- 机器学习项目中使用统计学方法的十个例子
- 拓端tecdat|在R语言中使用概率分布:dnorm,pnorm,qnorm和rnorm
- 【印刷数字识别】基于matlab OCR识别系统【含Matlab源码 438期】
- [安全攻防进阶篇] 八.那些年的熊猫烧香及PE病毒行为机理分析
- python重复命令_python系列的连接和重复操作
- C++ SLT之map的用法总结
- Python语言程序设计基础_期末作品设计_答案_通识教育必修课程_上海师范大学
- vue的封装之路(二)-封装一个基于element ui的省市区级联选择器
- 余弦相似度(Cosine Similarity)
- hdu6441 Find Integer
- 如何在CSS和HTML中创建垂直线...
- android拓展内存卡,都取消存储卡拓展,而它却解决了安卓手机的大问题
- java中任何变量都可以被赋值为null,关于异常处理:为什么“throw null”没有在Java中创建编译错误?...
- office出现错误无法安装的解决办法
- 基于RT_Thread连接中国移动onenet平台的RGB三色灯项目
- 前端面试技巧和注意事项_web前端没有项目经验怎么应对面试?(技巧) -