Обнаружение круга/контура OpenCV Python

В настоящее время у меня возникают проблемы с правильным обнаружением кругов на изображении ниже (предварительная обработка), вывод может быть спорадическим в те моменты, когда он будет отображать круги полукорректно (постобработка). Изображение снимается в прямом эфире с веб-камеры с разрешением 800 * 600, а затем проходит через двусторонний фильтр, который помогает избавиться от нескольких ложных негативов (я попробовал GaussianBlur, но временами он работал очень медленно....).

После этого он становится серым, а затем передается через функцию HoughCircles для предоставления предоставленного вывода.

Я просмотрел функцию контуров, но не нашел такой хорошей документации, чтобы выяснить, к чему относится каждая переменная, если это имеет смысл (по крайней мере, для функций Python).

Я был бы признателен за любую помощь, чтобы сделать это более точным, поскольку конечная цель состоит в том, чтобы взять известные размеры отверстий и преобразовать их, чтобы увидеть, не находится ли расстояние между кругами для тестирования контроля качества. (и проверить, не удален ли круг, т.е. не там).

Предварительная обработка

Цвет постобработки

Постобработка Ч/Б

КОД:

import cv2
import os
import math
import numpy

minRad = 50
maxRad = 75

b1 = 2
b2 = 5
b3 = 5

c1 = 5
c2 = 200
c3 = 50
c4 = 100

bw = 1

vc =cv2.VideoCapture(0)
if vc.isOpened():
    vc.set(3,800)
    vc.set(4,600)
#       vc.set(10,10)
    rval, frame = vc.read()
else:
    rval = False

while rval:
    rval, frame = vc.read()
    blur = cv2.bilateralFilter(frame,b1,b2,b3)
#       blur = cv2.GaussianBlur(frame,(5,5),1)
    gray = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)#frame
#       edges = cv2.Canny(gray, 200, 20, apertureSize=3)#80 120 3
    edges = gray

    circles = cv2.HoughCircles(edges,cv2.cv.CV_HOUGH_GRADIENT,c1,c2,param1=c3,param2=c4,minRadius=minRad,maxRadius=maxRad)
    print "\n\n"
    print circles

    if circles != None:
        circles = numpy.uint16(numpy.around(circles),decimals=1)
        for cir in circles[0,:]:
            if bw == 1:
                cv2.circle(edges,(cir[0],cir[1]),cir[2],(0,255,0),2)#frame
                cv2.circle(edges,(cir[0],cir[1]),2,(0,0,255),)#frame
            else:           
                #draw outer circle
                cv2.circle(blur,(cir[0],cir[1]),cir[2],(0,255,0),2)#frame
                #draw center
                cv2.circle(blur,(cir[0],cir[1]),2,(0,0,255),)#frame
    if bw == 1:
        cv2.imwrite('/home/kasper/test/test.jpg', edges, [int(cv2.IMWRITE_JPEG_QUALITY), 90])   
    else:
        cv2.imwrite('/home/kasper/test/test.jpg', blur, [int(cv2.IMWRITE_JPEG_QUALITY), 90])
    ch = cv2.waitKey(10)

    if ch != -1:
        print "keypressed"
        print ch
        break
    cv2.destroyAllWindows()

Выход обнаружения круга:

[[[ 652.5         507.5          62.45398331]
  [ 282.5         522.5          57.36288071]
  [ 102.5         342.5          52.84410858]
  [ 462.5         327.5          67.7089386 ]
  [ 697.5         242.5          52.52142334]
  [  82.5         547.5          52.50238037]
  [ 307.5         167.5          63.04363632]
  [  92.5         137.5          67.79749298]]]

[[[ 287.5         522.5          52.616539  ]
  [ 647.5         507.5          57.50217438]
  [ 472.5         337.5          67.7089386 ]
  [  87.5         512.5          67.78273773]
  [  82.5         292.5          67.64983368]
  [ 687.5         212.5          52.5594902 ]
  [ 302.5         162.5          67.88593292]]]

person Friendlyghost89    schedule 06.06.2014    source источник
comment
Мне удалось заставить его версию работать и точно отслеживать теперь следующий шаг, который заключается в преобразовании данных пикселей в расстояние от известного значения круга... Я опубликую рабочий код в следующие 24-48 часов.   -  person Friendlyghost89    schedule 07.06.2014
comment
Вы должны попробовать сопоставление шаблонов.   -  person ivan_a    schedule 07.06.2014
comment
@ivan_a что, если камера немного сдвинется при совпадении с шаблоном?   -  person Friendlyghost89    schedule 09.06.2014
comment
В зависимости от того, вам придется сделать некоторые предположения и ограничить нашу систему, чтобы они их придерживались.   -  person ivan_a    schedule 09.06.2014
comment
Небольшое поступательное движение (не вращательное) не должно сильно влиять на производительность системы.   -  person ivan_a    schedule 09.06.2014
comment
Я только что заставил HoughCircle работать намного лучше (точно ~ +/- 0,09) по оси Y, усредняя круги по вертикали, я также собираюсь добавить некоторое усреднение по X, единственное условие должно быть, чтобы камера была прямой. ... Хотя я могу определить прямолинейность, найдя линию снаружи в качестве основы.   -  person Friendlyghost89    schedule 10.06.2014


Ответы (2)


Мне кажется, что выходные данные имеют формат (x, y, радиус), где (x, y) — центр каждого круга.

person yossiB    schedule 06.06.2014
comment
Вывод неверный, он не совпадает с кругами из предварительной обработки. и да, выходной формат - x, y, радиус. Я хочу иметь возможность точно отслеживать круги, чтобы я мог обнаружить смещение по мере их продвижения ... т.е. 1 набор не соответствует остальным или слишком большой зазор. - person Friendlyghost89; 07.06.2014

вы можете обнаружить дыры, используя этот код:

import numpy as np 

import cv2

from matplotlib import pyplot as plt

plt.ion()

filteredContour = []

img = cv2.imread('circle.png')

grayImage = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY)

binaryImage = np.uint8((grayImage < 100) *1)

binaryForContour = binaryImage*1

contour,hierarchy=cv2.findContours(binaryForContour,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
for iteration in range (0,len(contour)):

    areaOfContour = cv2.contourArea(contour[iteration])


    if areaOfContour >= 5000:

        filteredContour.append(contour[iteration])

        cv2.drawContours(img,filteredContour, -1, (0,255,0), 2)

        plt.imshow(img)

Изображение нечеткое. Если освещение правильное, то все получится.

person Midhun EM    schedule 19.07.2015