Ich möchte die LineIterator in openCV 3.0 mit Python verwenden, ist es immer noch mit OpenCV 3.0 für Python gebaut? Es scheint, dass die Antworten im Internet alle auf cv.InitLineIterator zeigen, der Teil des cv-Moduls ist. Ich habe versucht, dieses Modul zu importieren, aber es scheint, als wäre es nicht im aktuellen Build enthalten. Wurde es umbenannt oder strikt entfernt?openCV 3.0 python LineIterator
9
A
Antwort
20
Ich habe mein eigenes Problem gelöst. Der Zeileniterator scheint in der cv2-Bibliothek nicht verfügbar zu sein. Daher habe ich meinen eigenen Zeilen-Iterator erstellt. Es werden keine Loops verwendet, daher sollte es ziemlich schnell sein. Hier ist der Code, wenn jemand es braucht:
def createLineIterator(P1, P2, img):
"""
Produces and array that consists of the coordinates and intensities of each pixel in a line between two points
Parameters:
-P1: a numpy array that consists of the coordinate of the first point (x,y)
-P2: a numpy array that consists of the coordinate of the second point (x,y)
-img: the image being processed
Returns:
-it: a numpy array that consists of the coordinates and intensities of each pixel in the radii (shape: [numPixels, 3], row = [x,y,intensity])
"""
#define local variables for readability
imageH = img.shape[0]
imageW = img.shape[1]
P1X = P1[0]
P1Y = P1[1]
P2X = P2[0]
P2Y = P2[1]
#difference and absolute difference between points
#used to calculate slope and relative location between points
dX = P2X - P1X
dY = P2Y - P1Y
dXa = np.abs(dX)
dYa = np.abs(dY)
#predefine numpy array for output based on distance between points
itbuffer = np.empty(shape=(np.maximum(dYa,dXa),3),dtype=np.float32)
itbuffer.fill(np.nan)
#Obtain coordinates along the line using a form of Bresenham's algorithm
negY = P1Y > P2Y
negX = P1X > P2X
if P1X == P2X: #vertical line segment
itbuffer[:,0] = P1X
if negY:
itbuffer[:,1] = np.arange(P1Y - 1,P1Y - dYa - 1,-1)
else:
itbuffer[:,1] = np.arange(P1Y+1,P1Y+dYa+1)
elif P1Y == P2Y: #horizontal line segment
itbuffer[:,1] = P1Y
if negX:
itbuffer[:,0] = np.arange(P1X-1,P1X-dXa-1,-1)
else:
itbuffer[:,0] = np.arange(P1X+1,P1X+dXa+1)
else: #diagonal line segment
steepSlope = dYa > dXa
if steepSlope:
slope = dX.astype(np.float32)/dY.astype(np.float32)
if negY:
itbuffer[:,1] = np.arange(P1Y-1,P1Y-dYa-1,-1)
else:
itbuffer[:,1] = np.arange(P1Y+1,P1Y+dYa+1)
itbuffer[:,0] = (slope*(itbuffer[:,1]-P1Y)).astype(np.int) + P1X
else:
slope = dY.astype(np.float32)/dX.astype(np.float32)
if negX:
itbuffer[:,0] = np.arange(P1X-1,P1X-dXa-1,-1)
else:
itbuffer[:,0] = np.arange(P1X+1,P1X+dXa+1)
itbuffer[:,1] = (slope*(itbuffer[:,0]-P1X)).astype(np.int) + P1Y
#Remove points outside of image
colX = itbuffer[:,0]
colY = itbuffer[:,1]
itbuffer = itbuffer[(colX >= 0) & (colY >=0) & (colX<imageW) & (colY<imageH)]
#Get intensities from img ndarray
itbuffer[:,2] = img[itbuffer[:,1].astype(np.uint),itbuffer[:,0].astype(np.uint)]
return itbuffer
Erstaunlich! Sie haben meine Arbeit viel einfacher gemacht –
Die negative Stimme war versehentlich, ich kann es nicht rückgängig machen, wenn Sie die Antwort nicht ändern. Es tut uns leid! :/ – eudoxos
Danke für das Teilen von @mohiksan. Ich wollte nur anmerken, dass sich die Zeile etwas von der von 'cv2.drawLine()' angegebenen Zeile unterscheidet: Ihre Zeile enthält nicht den ersten Punkt 'P1', während' cv2.drawLine() 'sie enthält. – krookedking