[英]Drawing grid lines across the image using OpenCV Python
Using OpenCV python, I want to make a grid when I switch on my camera.使用 OpenCV python,我想在打开相机时制作一个网格。 Can you guys help me with a logic or code.
你们能帮我一个逻辑或代码吗? Please find the image link below for better understanding.
请找到下面的图片链接以更好地理解。
Here is the solution for my question guys.这是我的问题的解决方案。 Make use of it.
好好利用它。
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')
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
You can draw lines on the input image using the cv2.line() function.您可以使用cv2.line()函数在输入图像上绘制线条。 So depending on where you want to draw the lines, your basic code will look like:
因此,根据您要绘制线条的位置,您的基本代码将如下所示:
img = cv2.imread(r"path\to\img")
cv2.line(img, (start_x, start_y), (end_x, end_y), (255, 0, 0), 1, 1)
To get the dimensions of the image, you can use img.shape
which will return (height, width)
.要获取图像的尺寸,您可以使用将返回
(height, width)
的img.shape
。
To draw a vertical line through the center for example, your code would look like:例如,要通过中心绘制一条垂直线,您的代码将如下所示:
cv2.line(img, (int(img.shape[1]/2), 0),(int(img.shape[1]/2), img.shape[0]), (255, 0, 0), 1, 1)
Here's a simple solution for creating an mxn grid (split as evenly as possible):这是创建 mxn 网格的简单解决方案(尽可能均匀地分割):
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
Here's a script that wraps this function in a CLI: https://gist.github.com/mathandy/389ddbad48810d188bdc997c3a1dab0c这是在 CLI 中包装此函数的脚本: https ://gist.github.com/mathandy/389ddbad48810d188bdc997c3a1dab0c
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.