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相关推荐

  1. 【opencv】3.在一个opencv窗口中显示多个视频界面、画箭头、画掉头箭头

    1.在一个opencv窗口中显示不同视频界面 /** * @brief 在一个opencv窗口win_name中显示不同视频界面 * @param img_1 和 img_2 是分别是取自不同视频中的 ...

  2. python画箭头表示风速风向_python画风羽及风羽定义

    basemap使用手册:链接:https://pan.baidu.com/s/1CUgQcsuYMbJAdCuij4WsLQ 提取码:aw16 如果想用箭头画风场,请看另一篇python matplo ...

  3. Python 用 OpenCV 画椭圆 (5)

    利用 OpenCV 自带的 ellipse() 函数画椭圆 并显示,其函数声明如下: cv2.ellipse(img, center, axes, rotateAngle, startAngle, e ...

  4. 在OpenCV里用arrowedLine画箭头图形

    经常使用OpenCV来做项目,就发现有更多的需求,比如像下图中使用箭头来指示: 看到白色的箭头来标记目标物体,这样才会让大家看东西更加具体化,更加形象化,特别用在教育领域,想让学生看到目标区域,使用箭 ...

  5. Python OpenCV画圆

    Python OpenCV画圆 PS: 也是从网上各个帖子中学习的Python,因此代码的格式以及内容有粘贴网上其他大神的代码,如有侵权请告知删除 在图片中检测圆,并进行标注 #!/usr/bin/p ...

  6. python matplotlib quiver——画箭头、风场

    如果想用风羽画风场,请看另一篇python画风羽及风羽定义 目录 用像素点坐标画图 用经纬度坐标画图(推荐) PS:三维箭头可参考: https://matplotlib.org/mpl_toolki ...

  7. python画箭头opencv_OpenCV绘制箭头线

    OpenCV绘制箭头线 可以使用imgproc类的arrowedLine()方法在图像上绘制箭头线. 以下是这种方法的语法 - arrowedLine(Mat img, Point pt1, Poin ...

  8. 用python画花瓣-Python竟能画这么漂亮的花,帅呆了(代码分享)

    阅读本文大概需要3分钟 关于函数和模块讲了这么久,我一直想用一个好玩有趣的小例子来总结一下,同时也作为实战练习一下. 趣味编程其实是最好的学习途径,回想十几年前我刚毕业的时候,第一份工作就给手机上写a ...

  9. opencv画直线,矩形

    opencv 画直线要画一条线,你只需要告诉函数这条线的起点和终点.我们下面会画一条从左上方到右下角的蓝色线段. import numpy as np import cv2# Create a bla ...

最新文章

  1. HTML文本错位,DIV+CSS网页错位诊断和解决方法
  2. 全球及中国矿棉板行业运营能力状况与十四五规模预测报告2022年
  3. tensorflow随笔-队列管理器QueueRunner-生产者与消费者
  4. Informatica bulk与normal模式的深入详解(转)
  5. 机器学习项目中使用统计学方法的十个例子
  6. 拓端tecdat|在R语言中使用概率分布:dnorm,pnorm,qnorm和rnorm
  7. 【印刷数字识别】基于matlab OCR识别系统【含Matlab源码 438期】
  8. [安全攻防进阶篇] 八.那些年的熊猫烧香及PE病毒行为机理分析
  9. python重复命令_python系列的连接和重复操作
  10. C++ SLT之map的用法总结
  11. Python语言程序设计基础_期末作品设计_答案_通识教育必修课程_上海师范大学
  12. vue的封装之路(二)-封装一个基于element ui的省市区级联选择器
  13. 余弦相似度(Cosine Similarity)
  14. hdu6441 Find Integer
  15. 如何在CSS和HTML中创建垂直线...
  16. android拓展内存卡,都取消存储卡拓展,而它却解决了安卓手机的大问题
  17. java中任何变量都可以被赋值为null,关于异常处理:为什么“throw null”没有在Java中创建编译错误?...
  18. office出现错误无法安装的解决办法
  19. 基于RT_Thread连接中国移动onenet平台的RGB三色灯项目
  20. 前端面试技巧和注意事项_web前端没有项目经验怎么应对面试?(技巧) -

热门文章

  1. 2022 世界人工智能大会,都讲了些啥?
  2. BI神器Power Query(1)-- 什么是PQ?
  3. 【小白】【大学】一名嵌入式软件开发小白的单片机学习历程、心路历程、经验分享
  4. 批量下载coursera课程
  5. studing method for linux
  6. 关于机器学习特征选择的方法总结
  7. 北京革新创展科技有限公司-BICE-EDA存储器设计实验(实验3.1 存储器设计实验)
  8. UEFI开发与调试--edk2中的基础组件
  9. 160个CrackMe 077 firework2
  10. Bottom Sheets