Python 比较两幅图像并检测它们的特征

Python 比较两幅图像并检测它们的特征,python,opencv,Python,Opencv,我正在研究使用OpenCV和python进行图像处理的“反向图像搜索”和 我的问题是,我如何才能找到图像中的各种对象。 我使用cv2.calchist来查找图像的特征并进行训练,但在查找对象方面没有很好的效果,它给我的结果更多的是根据颜色,而不是形状和特征 我的提取功能代码是: image=cv2.imread(args["query"]) hsvimg = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) ret, thresh = cv2.threshold(h

我正在研究使用OpenCV和python进行图像处理的“反向图像搜索”和 我的问题是,我如何才能找到图像中的各种对象。 我使用cv2.calchist来查找图像的特征并进行训练,但在查找对象方面没有很好的效果,它给我的结果更多的是根据颜色,而不是形状和特征

我的提取功能代码是:

image=cv2.imread(args["query"])
hsvimg = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

ret, thresh = cv2.threshold(hsvimg, 127, 255, cv2.THRESH_BINARY)
edged = cv2.Canny(hsvimg, 50, 100)
edged = cv2.dilate(edged, None, iterations=1)
edged = cv2.erode(edged, None, iterations=1)
cnts = cv2.findContours(edged.copy(), cv2.RETR_EXTERNAL,
                    cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if imutils.is_cv2() else cnts[1]

features = []

(cnts, _) = contours.sort_contours(cnts)

maxArea = -1
#detect bigest ellipse
for c in cnts:
    if len(c) < 5:
        continue

    (ex, ey), (MA, ma), angle = cv2.fitEllipse(c)

    if angle == 0:
        continue

    ellipseArea = math.pi * MA * ma / 4

    if ellipseArea > maxArea:
        maxArea = ellipseArea


for c in cnts:
    if len(c) < 5:
        continue
    (ex, ey), (MA, ma), angle = cv2.fitEllipse(c)
    if angle == 0:
        continue

    ellipseArea = math.pi * MA * ma / 4
    if ellipseArea != maxArea:
        continue

    ellipse = cv2.fitEllipse(c)


    mask = np.zeros(image.shape[:2], dtype="uint8")
    cv2.ellipse(mask, ellipse, 255, -1)

    hist = cv2.calcHist([image], [0, 1, 2], mask, self.bins, [0, 180, 0, 256, 0, 256])
    hist = cv2.normalize(hist, hist, 0, 255, cv2.NORM_MINMAX).flatten()

    features.extend(hist)

return features
image=cv2.imread(args[“query”])
hsvimg=cv2.cvt颜色(图像,cv2.COLOR\u BGR2HSV)
ret,thresh=cv2.阈值(hsvimg,127255,cv2.thresh_二进制)
边缘=cv2.Canny(hsvimg,50,100)
边缘=cv2。扩张(边缘,无,迭代次数=1)
边缘=cv2。侵蚀(边缘,无,迭代次数=1)
cnts=cv2.findContentours(edge.copy(),cv2.RETR_EXTERNAL,
cv2.链条(近似简单)
cnts=cnts[0]如果imutils.is_cv2()其他cnts[1]
功能=[]
(CNT,U)=等高线。等高线排序(CNT)
maxArea=-1
#检测最大椭圆
对于碳纳米管中的碳:
如果len(c)<5:
持续
(ex,ey),(MA,MA),角度=cv2.椭圆(c)
如果角度=0:
持续
ellipseArea=math.pi*MA*MA/4
如果ellipseArea>maxArea:
最大面积=椭圆面积
对于碳纳米管中的碳:
如果len(c)<5:
持续
(ex,ey),(MA,MA),角度=cv2.椭圆(c)
如果角度=0:
持续
ellipseArea=math.pi*MA*MA/4
如果ellipseArea!=最大面积:
持续
椭圆=cv2。椭圆(c)
掩码=np.0(image.shape[:2],dtype=“uint8”)
椭圆(遮罩,椭圆,255,-1)
hist=cv2.calcHist([image]、[0,1,2]、mask、self.bin、[0,180,0,256,0,256])
hist=cv2.normalize(hist,hist,025,cv2.NORM\u MINMAX).flatten()
功能。扩展(历史)
返回特性
此代码表示下面的两个imeges是相同的


请提供一些代码示例请提供一些代码示例