Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何找到穿过水滴质心的水滴的主轴?_Python_Opencv_Blob_Axis_Centroid - Fatal编程技术网

Python 如何找到穿过水滴质心的水滴的主轴?

Python 如何找到穿过水滴质心的水滴的主轴?,python,opencv,blob,axis,centroid,Python,Opencv,Blob,Axis,Centroid,我想找到一个水滴的主轴,它穿过水滴的质心。我能找到水滴的质心,但我怎么能找到主轴呢 以下是我尝试过的: import cv2 import numpy as np img = cv2.imread('skin6.jpg') imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) ret, thresh2 = cv2.threshold(imgray, 155, 255, cv2.THRESH_BINARY_INV) #find the maximum

我想找到一个水滴的主轴,它穿过水滴的质心。我能找到水滴的质心,但我怎么能找到主轴呢

以下是我尝试过的:

import cv2
import numpy as np

img = cv2.imread('skin6.jpg')

imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh2 = cv2.threshold(imgray, 155, 255, cv2.THRESH_BINARY_INV)

#find the maximum contour
contours, heir = cv2.findContours(thresh2, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
c = max(contours, key = cv2.contourArea)

tmpArea = np.zeros(img.shape)
cv2.drawContours(tmpArea,[c],0,(255, 255, 255),cv2.FILLED)

#centroid
M = cv2.moments(c)
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])

cv2.circle(tmpArea, (cx, cy), 5, (0, 0, 255), -1)

cv2.imshow("tmpArea", tmpArea)
cv2.waitKey(0)
以下是我使用的图像:

我期待着这样的事情。应与轮廓线正确连接:

您可以在检测到的轮廓上使用。得到拟合椭圆的中心、两个轴的长度(请仔细查看)和旋转角度。从这些信息中,只需要一些数学运算就能得到主轴穿过中心

以下是经过一些修改和添加的代码:

导入cv2
将numpy作为np导入
#图像
img=cv2.imread('images/1KXQA.jpg')
img_gray=cv2.CVT颜色(img,cv2.COLOR_BGR2GRAY)
thresh2=cv2.阈值(img_gray,155255,cv2.THRESH_BINARY_INV)[1]
tmpArea=np.零(img.形状)
#轮廓
等高线=cv2.查找到的等高线(阈值2,cv2.RETR_树,cv2.CHAIN_近似值_无)[0]
c=最大值(轮廓,关键点=cv2.轮廓面积)
cv2.等高线图(tmpArea,[c],0,(255,255,255),cv2.填充)
#质心
M=cv2.力矩(c)
cx=int(M['m10']/M['m00']
cy=int(M['m01']/M['m00']
cv2.圆(tmpArea,(cx,cy),5,(0,0,255),-1)
#椭圆
e=cv2.5(c)
椭圆(tmpArea,e,(0,255,0),2)
#主轴
x1=int(np.round(cx+e[1][1]/2*np.cos((e[2]+90)*np.pi/180.0)))
y1=int(np.round(cy+e[1][1]/2*np.sin((e[2]+90)*np.pi/180.0)))
x2=int(np.round(cx+e[1][1]/2*np.cos((e[2]-90)*np.pi/180.0)))
y2=int(np.round(cy+e[1][1]/2*np.sin((e[2]-90)*np.pi/180.0)))
cv2.线(tmpArea,(x1,y1),(x2,y2),(255,255,0),2)
#输出
cv2.imshow('tmpArea',tmpArea)
cv2.等待键(0)
输出如下所示:

----------------------------------------
系统信息
----------------------------------------
平台:Windows-10-10.0.16299-SP0
Python:3.8.5
努比:1.19.5
OpenCV:4.5.1
----------------------------------------

干得好-继续回答!谢谢你的回答,但是在我的数据集中有不对称的皮肤损伤,所以它对那些图像不起作用。还有别的方法可以得到主轴吗@HansHirse@NaduniJayaweera然后,请在您的问题中添加显示所需主轴的其他图像,可能是手动绘制的。对于第二个新提供的图像,我不确定最终结果是什么@HansHirse@NaduniJayaweera不幸的是,这个图像本身并没有太大的帮助,因为没有描述,主轴实际上是什么。是的,这是带θ角的蓝线,但定义是什么,蓝线是如何获得的?在你的例子中,对应的蓝线是什么?请将这些绘制到您的图像中,并提供主轴的正确描述。