opencv测距python,python opencv边缘检测
本文介绍了如何用python语言实现角度测量。该程序包括鼠标点选择、直线斜率计算和角度计算,以及一个主程序。有兴趣的可以看看。
本文介绍了如何用python语言实现角度测量。该程序包括鼠标点选择、直线斜率计算和角度计算,以及一个主程序。最终效果:用鼠标确认图片上的三个点,程序会显示这三个点确定的角度,如下图。
1、鼠标选点
# -*-编码: utf-8 -*-
导入cv2
path= picture _ mqa angle _ measure . BMP
img=cv2.imread(路径)
pointsList=[]
def mousePoints(事件,x,y,标志,参数):
如果事件==cv2。EVENT_LBUTTONDOWN:
cv2.circle(img,(x,y),5,(0,0,255),cv2。已填充)
打印(x,y)
而True:
cv2.imshow(Image ,img)
cv2.setMouseCallback(Image ,mousePoints)
key_scan=cv2.waitKey(1)0xff
if key_scan==ord(q):
pointsList=[]
img=cv2.imread(路径)
elif key_scan==ord(s):
破裂
cv2.destroyAllWindows()
While循环cv2.setmouseCallback (Image ,mousePoints)是鼠标中断触发事件的开始函数,用于跳转到mousePoints()中断服务函数,并为mousepoints()的五个入口参数event、X、Y、Flags和Params赋值。Event是cv2_EVENT_* (MouseEventTypes)类型的变量,是鼠标触发的中断事件的类型;x和y是鼠标触发中断事件时图像的横坐标和纵坐标;Flags是CV2 _ event _ flag _ *(鼠标事件标志)类型的变量,是特殊中断事件的标志位;Param是用户定义的参数。EVENT_LBUTTONDOW#在本文的程序中使用,通过单击鼠标左键来触发事件。用鼠标左键点击时,标记该点并记录其坐标。
事件的分配:
EVENT _ MOUSEMOVE # slide EVENT _ LBUTTONDOWN #左键单击EVENT_RBUTTONDOWN #右键单击EVENT_MBUTTONDOWN #左键单击以释放EVENT_RBUTTONUP #右键单击以释放EVENT_LBUTTONDBLCLK #左键单击EVENT_RBUTTONDBLCLK #右键单击EVENT_MBUTTONDBLCLK #中键单击以释放2、角度计算
1我们可以得到鼠标点击位置的坐标,并把它们放在pointList列表中。当列表中的坐标数是3的倍数时,调用getAngle()函数计算由三点确定的两条直线的夹角。
定义梯度(pt1,pt2):
return((pt2[1]-pt1[1])/(pt2[0]-pt1[0])
def getAngle(pointsList):
pt1,pt2,pt3=pointsList[-3:]
m1=梯度(pt1,pt2)
m2=梯度(pt1,pt3)
angR=ABS(math . atan((m2-m1)/(1 m2 * m1)))
angD=round(数学学位(angR))
cv2.putText(img,str(angD),(pt1[0]-40,pt1[1]-20),cv2。FONT_HERSHEY_COMPLEX,
1.5,(0,0,255))
根据直线的两点方程,直线的倾角为angle=arctan(y2-y1,x2-x1),两条直线的夹角为angle 0=angle 1-angle 2=arctan(y2-y1,x2-x1)-arctan (y2-y3,x2-x3)。上面的函数可以根据三点的坐标值计算出三点所形成的角的角度。
3、完整程序
# -*-编码: utf-8 -*-
测量鼠标点击的三个点所形成的角度。
导入cv2
导入数学
path= picture _ mqa angle _ measure . BMP #图片路径
img=cv2.imread(路径)
pointsList=[]
#鼠标中断触发函数,跟踪鼠标触发事件位置的点,并在pointList列表中记录该点的坐标值。
#连接相邻三点形成一个夹角。
def mousePoints(事件,x,y,标志,参数):
如果事件==cv2。EVENT_LBUTTONDOWN:
size=len(pointsList)
如果大小!=0,大小为%3!=0:
cv2.line(img,tuple(points list[round((size-1)/3)* 3]),(x,y),(0,0,255))
cv2.circle(img,(x,y),5,(0,0,255),cv2。已填充)
pointsList.append([x,y])
#从两点的坐标值计算两点所在直线的斜率。
定义梯度(pt1,pt2):
return((pt2[1]-pt1[1])/(pt2[0]-pt1[0])
#根据相邻三点计算夹角的角度值。
def getAngle(pointsList):
pt1,pt2,pt3=pointsList[-3:]
m1=梯度(pt1,pt2)
m2=梯度(pt1,pt3)
angR=ABS(math . atan((m2-m1)/(1 m2 * m1)))
angD=round(数学学位(angR))
cv2.putText(img,str(angD),(pt1[0]-40,pt1[1]-20),cv2。FONT_HERSHEY_COMPLEX,
1.5,(0,0,255))
而True:
2.imshow (image ,img) #图像显示
2.简历。SetMouseCallback (image ,mousePoints) #鼠标触发事件打开。
if len(pointsList) % 3==0且len(pointsList)!=0: #鼠标每触发一次中断,其形态角度的角度值计算一次。
getAngle(pointsList)
Key_scan=cv2.waitKey(1)0xff #键盘扫描
如果key_scan==ord(q): #当输入 q 时,画面刷新
pointsList=[]
img=cv2.imread(路径)
Elif key_scan==ord(s): #输入 s 时退出程序
破裂
cv2.destroyAllWindows()
这就是这篇关于Python OpenCV角度测量的示例代码。关于Python OpenCV角度测量的更多信息,请搜索热门IT软件开发工作室之前的文章或者继续浏览下面的相关文章。希望大家以后多多支持热门IT软件开发工作室!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。