OpenCV 3.0 LineIterator

发布于 2021-01-29 18:40:19

我想在使用Python的OpenCV
3.0中使用LineIterator,在为Python构建的OpenCV
3.0中仍然可用吗?似乎互联网上的答案都指向模块的cv.InitLineIterator一部分cv。我尝试导入此模块,但似乎它不包含在当前版本中。是否已重命名或严格将其删除?

关注者
0
被浏览
174
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我已经解决了自己的问题。行迭代器似乎在cv2库中不可用。因此,我做了自己的行迭代器。没有使用循环,因此它应该非常快。如果有人需要,下面是代码:

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看