我有以下圖像:。OpenCV,將對象分成零件
在OpenCV(最好是Python)中是否有一個函數可以說這個圖片中的對象可以被分成幾部分。例如,第一個對象由兩個段(或兩行)組成,即三個(或四個)中的第三個。
如果OpenCV沒有這樣的東西,那麼在任何地方瞭解這樣的算法/函數都會很棒。
我有以下圖像:。OpenCV,將對象分成零件
在OpenCV(最好是Python)中是否有一個函數可以說這個圖片中的對象可以被分成幾部分。例如,第一個對象由兩個段(或兩行)組成,即三個(或四個)中的第三個。
如果OpenCV沒有這樣的東西,那麼在任何地方瞭解這樣的算法/函數都會很棒。
此問題可以通過鏤空圖像然後使用HoughlinesP來解決。 Scikit-image有很好的骨架化方法。 如下圖所示,直線尋找14條線段。 最後,您將需要經過並找出哪組線相交以查看哪些屬於一起。
#!/usr/bin/python
from skimage import morphology
import cv2
import math
import numpy as np
im = cv2.imread("objects.png")
dst = cv2.cvtColor(im, cv2.COLOR_BGR2GRAY)
dst = 1 - dst/255
dst = morphology.skeletonize(dst).astype(np.uint8)
objs = 255 * dst
#cv2.HoughLinesP(image, rho, theta, threshold[, lines[, minLineLength[, maxLineGap]]])
rho = 1
theta = math.pi/180
threshold = 1
minLineLength = 3
maxLineGap = 5
lines = np.ndarray([1, 1, 4, 4])
lines = cv2.HoughLinesP(dst, rho, theta, threshold, lines, minLineLength, maxLineGap)
lineColor = (0, 255, 0) # red
for line in lines[0]:
#print line
cv2.line(im, (line[0], line[1]), (line[2], line[3]), lineColor, 1, 8)
#
# Now you need to go through lines and find those that intersect
# You will notice that some lines have small gaps where they should
# join to a perpendicular line. Before find intersections you would
# need to make each line longer (just by adjusting the numbers in lines)
# to get around this problem.
#
cv2.imshow('Objects', objs)
cv2.imshow('Lines', im)
cv2.imwrite('lines.png', im)
cv2.waitKey()
cv2.destroyAllWindows()
我有執行該代碼有問題。我搜索了很多,但很少發現信息: 'code' OpenCV錯誤:斷言失敗(scn == 3 || scn == 4)在未知函數中,文件.. \ .. \ .. \ opencv -2.4.7 \ modules \ imgproc \ src \ color.cpp,line 3737 dst = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) cv2.error:.. \ .. \ .. \ opencv-2.4.7 \ modules \ imgproc \ src \ color.cpp:3737:error:(-215)scn == 3 || scn == 4 我試過替換cv2.COLOR_BGR2GRAY,但結果是一樣的 – bdshadow
像你的圖像這樣的圖像可能已經是單通道了,試着省略'cv2.cvtColor()',即設置'dst = im' – Bull
OpenCV的霍夫變換線可能會幫助你http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html – Haris