红点坐标检测

2024-05-13 02:34:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着用红点跟踪零件的运动。我以前试过使用白点和阈值,但我使用的智能手机反射太多。计划是将点识别为轮廓,找到中心并用所有轮廓中心的坐标填充阵列,以便进一步计算

代码如下所示,它可以识别正确的点数,但我得到的除法是零。有人知道我做错了什么吗

图像:https://imgur.com/a/GLXGCPP

import cv2
import numpy as np
from matplotlib import pyplot as plt
import imutils

#load image
img = cv2.imread('dot4_red.jpg')

#apply median blur, 15 means it's smoothing image 15x15 pixels
blur = cv2.medianBlur(img,15)

#convert to hsv
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)

#color definition
red_lower = np.array([0,0,240])
red_upper = np.array([10,10,255])

#red color mask (sort of thresholding, actually segmentation)
mask = cv2.inRange(hsv, red_lower, red_upper)

#copy image for, .findContours distorts the source image
mask_copy = mask.copy()

#find contours
cnts = cv2.findContours(mask_copy,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)

#extract contours from the list??
cnts = imutils.grab_contours(cnts)

#count number of conoturs of specific size
s1 = 500
s2 = 10000
xcnts = []
for cnt in cnts:
    if s1<cv2.contourArea(cnt)<s2:
        xcnts.append(cnt)

n = len(xcnts)

#pre-allocate array for extraction of centers of contours
s = (n,2)
array = np.zeros(s)

#fill array of center coordinates 
for i in range(0,n):
    cnt = cnts[i]
    moment = cv2.moments(cnt)
    c_x = int(moment["m10"]/moment["m00"])
    c_y = int(moment["m01"]/moment["m00"])

    array[i,:] = [c_x, c_y]

#display image
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', mask)
cv2.waitKey(0) & 0xFF
cv2.destroyAllWindows()

#print results
print ('number of dots, should be 4:',n)
print ('array of dot center coordinates:',array)

Tags: ofimageimportfornpmaskredarray
2条回答

根据cv文档,对于某些形状,动量0(面积)可以为0。这可能就是这里发生的事情:

Note Since the contour moments are computed using Green formula, you may get seemingly odd results for contours with self-intersections, e.g. a zero area (m00) for butterfly-shaped contours.

发件人:https://docs.opencv.org/3.4/d8/d23/classcv_1_1Moments.html#a8b1b4917d1123abc3a3c16b007a7319b

在使用面积(m00)进行分割之前,需要确保面积(m00)不是0

问题是颜色范围不对。因此,圆圈的遮罩上有洞。由于被零除。M00。您可以选择正确的颜色范围或预填充遮罩中的孔。或使用以下代码:

import cv2
import numpy as np
#load image
img = cv2.imread('ZayrMep.jpg')

#apply median blur, 15 means it's smoothing image 15x15 pixels
blur = cv2.medianBlur(img,15)

#convert to hsv
hsv = cv2.cvtColor(blur, cv2.COLOR_BGR2HSV)

#color definition
red_lower = np.array([160,210,230])
red_upper = np.array([180,255,255])

#red color mask (sort of thresholding, actually segmentation)
mask = cv2.inRange(hsv, red_lower, red_upper)

connectivity = 4  
# Perform the operation
output = cv2.connectedComponentsWithStats(mask, connectivity, cv2.CV_32S)
# Get the results

num_labels = output[0]-1

centroids = output[3][1:]
#print results
print ('number of dots, should be 4:',num_labels )
print ('array of dot center coordinates:',centroids)

相关问题 更多 >