2017-01-16 10 views
3

У меня есть изображение коробки. Я пытаюсь обнаружить углы и отметить этот угол из кругов. Я использую следующий код для этого:Угловое обнаружение в обработке изображений Opencv Python

import cv2 
import numpy as np 

img_file = 'Image.jpg' 
img = cv2.imread(img_file, cv2.IMREAD_COLOR) 

imgDim = img.shape 
dimA = imgDim[0] 
dimB = imgDim[1] 

# RGB to Gray scale conversion 
img_gray = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) 
# Noise removal with iterative bilateral filter(removes noise while preserving edges) 
noise_removal = cv2.bilateralFilter(img_gray,9,75,75) 
# Thresholding the image 
ret,thresh_image = cv2.threshold(noise_removal,220,255,cv2.THRESH_OTSU) 
th = cv2.adaptiveThreshold(noise_removal, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) 

# Applying Canny Edge detection 
canny_image = cv2.Canny(th,250,255) 
canny_image = cv2.convertScaleAbs(canny_image) 

# dilation to strengthen the edges 
kernel = np.ones((3,3), np.uint8) 
# Creating the kernel for dilation 
dilated_image = cv2.dilate(canny_image,kernel,iterations=1) 
np.set_printoptions(threshold=np.nan) 

_, contours, h = cv2.findContours(dilated_image, 1, 2) 
contours= sorted(contours, key = cv2.contourArea, reverse = True)[:1] 


corners = cv2.goodFeaturesToTrack(thresh_image,6,0.06,25) 
corners = np.float32(corners) 

for item in corners: 
    x,y = item[0] 
    cv2.circle(img,(x,y),10,255,-1) 
cv2.namedWindow("Corners", cv2.WINDOW_NORMAL) 
cv2.imshow("Corners",img) 
cv2.waitKey() 

Этот код будет возвращать мое изображение с указанием края с кругами, но вы можете видеть, что два ребра (ребра на задней части коробки) обнаружены неправильно. Я знаю, что есть некоторая проблема в определении углов, потому что здесь мы просто замышляем углы. Может ли кто-нибудь вести меня, где я делаю это неправильно? Благодаря enter image description here

enter image description here

+0

после определения краев, найдите способ найти пересечения этих ребер => Углы. :) –

+0

Что вы имеете в виду, когда говорите, узнаете пересечение ребер? – muazfaiz

+0

Получите крайнюю грань изображений и найдите их перекрестки. Посетите [ЭТО ОТВЕТ] (http://stackoverflow.com/questions/10196198/how-to-remove-convexity-defects-in-a-sudoku-square/11366549#11366549). Упование помогает –

ответ

5

Я бы не сказал, я достиг наилучшего решения, но после довольно много кодирования я смог получить следующее:

enter image description here

Для получения этого Я выполнил следующие шаги:

1. Сначала: Получить края коробки

  • я выполнил двустороннюю фильтрацию на черно-белое изображение.
  • Найдено краев, используя Обнаружение крохотных краев.
  • Усовершенствованные края с использованием морфологической дилатации.

Это результат выше:

enter image description here

Теперь, когда я сделал обнаружения Угловая, я вовсе не был удовлетворен:

enter image description here

Так что я сделал?

2. Нахождение желаемого углы

  • Я размыты расширяющихся изображений, используя окно размера 9х9.
  • Затем применяется Определение угла Гарриса к этому размытому изображению.

В результате мне удалось получить это:

enter image description here

Я знаю, что это не является совершенным, но он всегда может быть точно настроен.

Вот код для обнаружения угла:

dst = cv2.cornerHarris(dilate,2,3,0.04) 
#----result is dilated for marking the corners, not important------------- 
dst = cv2.dilate(dst,None) 
#----Threshold for an optimal value, it may vary depending on the image--- 
img[dst>0.01*dst.max()]=[0,0,255] 
+0

Спасибо за обмен. Это было лучшее решение для меня до сих пор. – muazfaiz

+0

Я очень рад, что смог помочь –

0

@Jeru Люк. Почему не Harriscornering основан на данных результата с вашего шага1?

  1. я выполнил двустороннюю фильтрацию на черно-белое изображение.
  2. Обнаружены края, используя обнаружение края канна.
  3. Усовершенствованные края с использованием морфологической дилатации.

Если вы это сделаете, роспись по углам будет аккуратной и соответствовать в пределах линий, не так ли?

 Смежные вопросы

  • Нет связанных вопросов^_^