2017-06-16 130 views
0

我正在使用Python和OpenCV。我試圖找到電池的中心和角度:如何查找圖像中物體的中心和角度?

Image of batteries with random angles: enter image description here

比我的代碼是這樣的:

import cv2 
import numpy as np 


img = cv2.imread('image/baterias2.png') 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
img2 = cv2.imread('image/baterias4.png',0) 


minLineLength = 300 
maxLineGap = 5 

edges = cv2.Canny(img2,50,200) 
cv2.imshow('Canny',edges) 
lines = cv2.HoughLinesP(edges,1,np.pi/180,80,minLineLength,maxLineGap) 
print lines 
salida = np.zeros((img.shape[0],img.shape[1])) 
for x in range(0, len(lines)): 
    for x1,y1,x2,y2 in lines[x]: 
     cv2.line(salida,(x1,y1),(x2,y2),(125,125,125),0)# rgb 


cv2.imshow('final',salida) 
cv2.imwrite('result/hough.jpg',img) 
cv2.waitKey(0) 

任何想法去解決它?

+0

你試過了什麼? – saul

+0

你好。我正在嘗試這個步驟:1.門檻,2. Canny,3.線條,但顯示我不完整的線條。 –

+0

請分享您使用過的代碼以及當前的輸出結果嗎? – ZdaR

回答

0

您可以參考代碼。

import cv2 
import imutils 
import numpy as np 

PIC_PATH = r"E:\temp\Battery.jpg"  

image = cv2.imread(PIC_PATH) 

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
blurred = cv2.GaussianBlur(gray, (5, 5), 0)  

edged = cv2.Canny(gray, 100, 220) 

kernel = np.ones((5,5),np.uint8) 
closed = cv2.morphologyEx(edged, cv2.MORPH_CLOSE, kernel) 

cnts = cv2.findContours(closed.copy(), cv2.RETR_EXTERNAL, 
    cv2.CHAIN_APPROX_SIMPLE) 
cnts = cnts[0] if imutils.is_cv2() else cnts[1] 

cv2.drawContours(image, cnts, -1, (0, 255, 0), 4) 

cv2.imshow("Output", image) 
cv2.waitKey(0) 

結果畫面,

enter image description here

+0

OP想要找到每個單元格的中心和角度 – ZdaR

3

幾乎相同one of my other answers。 PCA似乎工作正常。

import cv2 
import numpy as np 

img = cv2.imread("test_images/battery001.png") #load an image of a single battery 
img_gs = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #convert to grayscale 
ret, thresh = cv2.threshold(img_gs, 250, 1, cv2.THRESH_BINARY) #binary threshold 
thresh = 1 - thresh #invert: 1 for the battery, 0 for the background 

h, w = thresh.shape 

#From a matrix of pixels to a matrix of coordinates of non-black points. 
#(note: mind the col/row order, pixels are accessed as [row, col] 
#but when we draw, it's (x, y), so have to swap here or there) 

mat = [[col, row] for col in range(w) for row in range(h) if thresh[row, col] != 0] 
mat = np.array(mat).astype(np.float32)#have to convert type for PCA 

#mean (e. g. the geometrical center) 
#and eigenvectors (e. g. directions of principal components) 
m, e = cv2.PCACompute(mat, mean = np.array([])) 

#now to draw: let's scale our primary axis by 100, 
#and the secondary by 50 
center = tuple(m[0]) 
endpoint1 = tuple(m[0] + e[0]*100) 
endpoint2 = tuple(m[0] + e[1]*50) 

red_color = (0, 0, 255) 
cv2.circle(img, center, 5, red_color) 
cv2.line(img, center, endpoint1, red_color) 
cv2.line(img, center, endpoint2, red_color) 
cv2.imwrite("out.png", img) 

enter image description here

0
  • 要找出一個物體的中心,你可以使用Moments。 對圖像進行閾值並使用findContours獲取對象的輪廓。 用cv.Moments(arr, binary=0) → moments計算矩。 由於arr你可以通過輪廓。然後中心的座標計算爲x = m10/m00y = m01/m00

  • 要獲取方向,可以在對象周圍畫一個最小的矩形並計算矩形的長邊和垂直線之間的角度。