Python OpenCV обнаружение кругов из двоичного изображения с помощью преобразования Hough Circle - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь разделить видео с пороговым значением на кадры, а затем пытаюсь найти круги на изображении. Но я искал, что преобразование двоичного изображения в оттенки серого невозможно. Я искал вокруг круга Хафа, и этот метод может делать только изображения в оттенках серого. Линии Hough могут работать на двоичных изображениях, а круги на кругах - нет. Есть ли совет использовать пороговые изображения в методе крутого круга? Пожалуйста, помогите мне.

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

**Binary Image (Threshold applied.)**

1 Ответ

0 голосов
/ 09 ноября 2018

Попробуйте использовать convertTo вместо cvtColor. Этот пример работает:

cv::Mat image = imread("binary.bmp");
cv::Mat outImage;
image.convertTo(outImage, CV_8U);
imwrite("grayscale.bmp", outImage);

P.S .: вам все равно придется поиграть с параметрами param1 и param2 HoughCircles в зависимости от того, насколько "круглыми" являются те круги, которые вы хотите обнаружить, в вашем случае это действительно не идеальный круг. На практике было бы намного легче начать обнаруживать монеты на изображении.

...