【问题标题】:Drawing grid lines across the image uisng opencv python使用opencv python在图像上绘制网格线
【发布时间】:2017-06-29 05:00:41
【问题描述】:

使用 OpenCV python,我想在打开相机时制作一个网格。你们能帮我一个逻辑或代码吗? 请找到下面的图片链接以便更好地理解。

Camera switched on and pointed to a floor

Grid Lines are split across the whole image

【问题讨论】:

    标签: python opencv


    【解决方案1】:

    这是我的问题的解决方案。好好利用吧。

    import matplotlib.pyplot as plt
    import matplotlib.ticker as plticker
    try:
        from PIL import Image
    except ImportError:
        import Image
    
    # Open image file
    image = Image.open('bird.jpg')
    my_dpi=200.
    
    # Set up figure
    fig=plt.figure(figsize=(float(image.size[0])/my_dpi,float(image.size[1])/my_dpi),dpi=my_dpi)
    ax=fig.add_subplot(111)
    
    # Remove whitespace from around the image
    fig.subplots_adjust(left=0,right=1,bottom=0,top=1)
    
    # Set the gridding interval: here we use the major tick interval
    myInterval=300.
    loc = plticker.MultipleLocator(base=myInterval)
    ax.xaxis.set_major_locator(loc)
    ax.yaxis.set_major_locator(loc)
    
    # Add the grid
    ax.grid(which='major', axis='both', linestyle='-', color='g')
    
    # Add the image
    ax.imshow(image)
    
    # Find number of gridsquares in x and y direction
    nx=abs(int(float(ax.get_xlim()[1]-ax.get_xlim()[0])/float(myInterval)))
    ny=abs(int(float(ax.get_ylim()[1]-ax.get_ylim()[0])/float(myInterval)))
    
    
    
    
    # Save the figure
    fig.savefig('birdgrid_without_Label.jpg')
    

    【讨论】:

      【解决方案2】:
      def draw_grid(img, line_color=(0, 255, 0), thickness=1, type_=_cv2.LINE_AA, pxstep=50):
          '''(ndarray, 3-tuple, int, int) -> void
          draw gridlines on img
          line_color:
              BGR representation of colour
          thickness:
              line thickness
          type:
              8, 4 or cv2.LINE_AA
          pxstep:
              grid line frequency in pixels
          '''
          x = pxstep
          y = pxstep
          while x < img.shape[1]:
              _cv2.line(img, (x, 0), (x, img.shape[0]), color=line_color, lineType=type_, thickness=thickness)
              x += pxstep
      
          while y < img.shape[0]:
              _cv2.line(img, (0, y), (img.shape[1], y), color=line_color, lineType=type_, thickness=thickness)
              y += pxstep
      

      【讨论】:

        【解决方案3】:

        您可以使用cv2.line() 函数在输入图像上画线。因此,根据您要在哪里画线,您的基本代码将如下所示:

        img = cv2.imread(r"path\to\img")
        cv2.line(img, (start_x, start_y), (end_x, end_y), (255, 0, 0), 1, 1)
        

        要获取图像的尺寸,您可以使用img.shape,它将返回(height, width)

        例如,要通过中心绘制一条垂直线,您的代码如下所示:

        cv2.line(img, (int(img.shape[1]/2), 0),(int(img.shape[1]/2), img.shape[0]), (255, 0, 0), 1, 1)
        

        【讨论】:

          【解决方案4】:

          这是一个创建 m x n 网格的简单解决方案(尽可能均匀地分割):

          import cv2 as cv  # tested with version 4.5.3.56 (pip install opencv-python)
          import numpy as np
          
          
          def draw_grid(img, grid_shape, color=(0, 255, 0), thickness=1):
              h, w, _ = img.shape
              rows, cols = grid_shape
              dy, dx = h / rows, w / cols
          
              # draw vertical lines
              for x in np.linspace(start=dx, stop=w-dx, num=cols-1):
                  x = int(round(x))
                  cv.line(img, (x, 0), (x, h), color=color, thickness=thickness)
          
              # draw horizontal lines
              for y in np.linspace(start=dy, stop=h-dy, num=rows-1):
                  y = int(round(y))
                  cv.line(img, (0, y), (w, y), color=color, thickness=thickness)
          
              return img
          

          这是一个在 CLI 中包装此函数的脚本: https://gist.github.com/mathandy/389ddbad48810d188bdc997c3a1dab0c

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-20
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多