Python Opencv利用霍夫圆变换从二值图像中检测圆
Python Opencv Detecting Circles from the Binary Image by Using Hough Circle Transform
我正在尝试将应用了阈值的视频分割成帧,然后尝试在图像中找到圆圈。但是我搜索了将二值图像转换为灰度图像是不可能的。我搜索了霍夫圆,该方法只能拍摄灰度图像。霍夫线可以在二值图像上工作,但霍夫圆不能。在霍夫圆法中使用阈值图像有什么建议吗?请帮我。
ps:我正在添加代码和图像,目的是在阈值图像中找到圆圈。
while videoCapture.isOpened(): #Begins to detect the captures in video by frames
ret, image = videoCapture.read()
print("image capture opened")
if ret == True:
#rgb = cv2.cvtColor(image, cv2.COLOR_HLS2RGB)
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
bgr = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) #converting video color to gray
print("gray scaled image\n")
frameCounter = frameCounter + 1
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=71, param2=70, minRadius=0, maxRadius=0)
if circles is not None:
print("Hough Circle on each frame")
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
cv2.circle(bgr, (i[0],i[1]), i[2], (0, 255, 0), 2) #Outer circle in the image
cv2.circle(bgr, (i[0],i[1]), 2, (0, 0, 255), 3) #inner circle center
print("inner outer circle draw")
cv2.imwrite(outputDir + "/%d.jpg" % (frameCounter), bgr) #Saving frame to the output directory
else :
print('Circle could not find')
cv2.imwrite(outputDir + "/%d.jpg" % (frameCounter), bgr) # Saving frame to the output directory
print("image saved to directory")
videoOutput.write(bgr)
if(frameCounter > (frameLength-1)):
endTime = time.time()
videoCapture.release()
videoOutput.release()
print("Converting video took %d seconds." % (endTime-startTime))
break
else:
break
尝试使用 convertTo 而不是 cvtColor。这个例子有效:
cv::Mat image = imread("binary.bmp");
cv::Mat outImage;
image.convertTo(outImage, CV_8U);
imwrite("grayscale.bmp", outImage);
P.S.: 你仍然需要使用 HoughCircles 的 param1 和 param2 参数,具体取决于 "circular" 是你想要检测的圆圈,在你的情况下它真的不是一个完美的圆圈。开始检测图像中的硬币进行练习会容易得多。
我正在尝试将应用了阈值的视频分割成帧,然后尝试在图像中找到圆圈。但是我搜索了将二值图像转换为灰度图像是不可能的。我搜索了霍夫圆,该方法只能拍摄灰度图像。霍夫线可以在二值图像上工作,但霍夫圆不能。在霍夫圆法中使用阈值图像有什么建议吗?请帮我。
ps:我正在添加代码和图像,目的是在阈值图像中找到圆圈。
while videoCapture.isOpened(): #Begins to detect the captures in video by frames
ret, image = videoCapture.read()
print("image capture opened")
if ret == True:
#rgb = cv2.cvtColor(image, cv2.COLOR_HLS2RGB)
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
bgr = cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR) #converting video color to gray
print("gray scaled image\n")
frameCounter = frameCounter + 1
circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, 1, 20, param1=71, param2=70, minRadius=0, maxRadius=0)
if circles is not None:
print("Hough Circle on each frame")
circles = np.uint16(np.around(circles))
for i in circles[0, :]:
cv2.circle(bgr, (i[0],i[1]), i[2], (0, 255, 0), 2) #Outer circle in the image
cv2.circle(bgr, (i[0],i[1]), 2, (0, 0, 255), 3) #inner circle center
print("inner outer circle draw")
cv2.imwrite(outputDir + "/%d.jpg" % (frameCounter), bgr) #Saving frame to the output directory
else :
print('Circle could not find')
cv2.imwrite(outputDir + "/%d.jpg" % (frameCounter), bgr) # Saving frame to the output directory
print("image saved to directory")
videoOutput.write(bgr)
if(frameCounter > (frameLength-1)):
endTime = time.time()
videoCapture.release()
videoOutput.release()
print("Converting video took %d seconds." % (endTime-startTime))
break
else:
break
尝试使用 convertTo 而不是 cvtColor。这个例子有效:
cv::Mat image = imread("binary.bmp");
cv::Mat outImage;
image.convertTo(outImage, CV_8U);
imwrite("grayscale.bmp", outImage);
P.S.: 你仍然需要使用 HoughCircles 的 param1 和 param2 参数,具体取决于 "circular" 是你想要检测的圆圈,在你的情况下它真的不是一个完美的圆圈。开始检测图像中的硬币进行练习会容易得多。