Python-Opencv:如何在图像上绘制不完整的有四个角的矩形
Python-Opencv:how to draw not complete rectangle with four corners on image
在网上搜索后,我找不到在 Python 中使用 OpenCV 绘制像 this 图像中那样的边界框的方法。它有两个特征,第一个四个角彼此不相连,第二个是透明边界框。
我知道我应该使用 Polygon,但我不能在这一点上更进一步。
试试这个代码。可能对你有帮助。
代码:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image
import numpy as np
image = np.array(Image.open('Image.jpg'), dtype=np.uint8)
# Create figure and axes
fig,ax = plt.subplots(1)
# Display the image
ax.imshow(image)
# Create a Rectangle patch
rect = patches.Rectangle((102,55),160,162,linewidth=1,edgecolor='r',facecolor='none')
# Add the patch to the Axes
ax.add_patch(rect)
plt.show()
图像输出:
以下函数在感兴趣区域周围绘制一个不完整的矩形。我为提供的每个点使用了两次 cv2.line()
。另外我还用了cv2.circle()
来标记4点。
只有一个限制条件。您必须按以下顺序提供 4 个点:左上角、左下角、右上角、右下角。
还有一个选项可以改变你想画的线的长度line_length
。
代码:
def draw_border(img, point1, point2, point3, point4, line_length):
x1, y1 = point1
x2, y2 = point2
x3, y3 = point3
x4, y4 = point4
cv2.circle(img, (x1, y1), 3, (255, 0, 255), -1) #-- top_left
cv2.circle(img, (x2, y2), 3, (255, 0, 255), -1) #-- bottom-left
cv2.circle(img, (x3, y3), 3, (255, 0, 255), -1) #-- top-right
cv2.circle(img, (x4, y4), 3, (255, 0, 255), -1) #-- bottom-right
cv2.line(img, (x1, y1), (x1 , y1 + line_length), (0, 255, 0), 2) #-- top-left
cv2.line(img, (x1, y1), (x1 + line_length , y1), (0, 255, 0), 2)
cv2.line(img, (x2, y2), (x2 , y2 - line_length), (0, 255, 0), 2) #-- bottom-left
cv2.line(img, (x2, y2), (x2 + line_length , y2), (0, 255, 0), 2)
cv2.line(img, (x3, y3), (x3 - line_length, y3), (0, 255, 0), 2) #-- top-right
cv2.line(img, (x3, y3), (x3, y3 + line_length), (0, 255, 0), 2)
cv2.line(img, (x4, y4), (x4 , y4 - line_length), (0, 255, 0), 2) #-- bottom-right
cv2.line(img, (x4, y4), (x4 - line_length , y4), (0, 255, 0), 2)
return img
line_length = 15
img = np.zeros((512,512,3), np.uint8)
cv2.imshow('img', img)
point1, point2, point3, point4 = (280,330), (280,390), (340,330), (340,390)
fin_img = draw_border(img, point1, point2, point3, point4, line_length)
cv2.imshow('fin_img', fin_img)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
此外,如果有人需要:在 C 中带有弯曲角的花式矩形:
但是我需要这个代码 python 社区回复了。
void draw_border(IplImage* show_img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness, int r, int d):
// Top left
cvLine(show_img, cvPoint( pt1.x +r, pt1.y), cvPoint( pt1.x + r + d, pt1.y), color, thickness, 8, 0 );
cvLine(show_img, cvPoint( pt1.x, pt1.y + r), cvPoint( pt1.x, pt1.y + r + d), color, thickness, 8, 0 );
cvEllipse(show_img, cvPoint(pt1.x +r, pt1.y + r), cvSize( r, r ), 180, 0, 90, color, thickness, 8, 0);
// Top right
cvLine(show_img, cvPoint( pt2.x - r, pt1.y), cvPoint( pt2.x - r - d, pt1.y), color, thickness, 8, 0 );
cvLine(show_img, cvPoint( pt2.x, pt1.y + r), cvPoint( pt2.x, pt1.y + r + d), color, thickness, 8, 0 );
cvEllipse(show_img, cvPoint(pt2.x -r, pt1.y + r), cvSize( r, r ), 270, 0, 90, color, thickness, 8, 0);
// Bottom left
cvLine(show_img, cvPoint( pt1.x + r, pt2.y), cvPoint( pt1.x + r + d, pt2.y), color, thickness, 8, 0);
cvLine(show_img, cvPoint( pt1.x, pt2.y - r), cvPoint( pt1.x, pt2.y - r - d), color, thickness, 8, 0);
cvEllipse(show_img, cvPoint(pt1.x + r, pt2.y - r), cvSize( r, r ), 90, 0, 90, color, thickness, 8, 0);
// Bottom right
cvLine(show_img, cvPoint( pt2.x - r, pt2.y), cvPoint( pt2.x - r - d, pt2.y), color, thickness, 8, 0);
cvLine(show_img, cvPoint( pt2.x, pt2.y - r), cvPoint( pt2.x, pt2.y - r - d), color, thickness, 8, 0);
cvEllipse(show_img, cvPoint(pt2.x - r, pt2.y - r), cvSize( r, r ), 0, 0, 90, color, thickness, 8, 0);
在网上搜索后,我找不到在 Python 中使用 OpenCV 绘制像 this 图像中那样的边界框的方法。它有两个特征,第一个四个角彼此不相连,第二个是透明边界框。
我知道我应该使用 Polygon,但我不能在这一点上更进一步。
试试这个代码。可能对你有帮助。
代码:
import matplotlib.pyplot as plt
import matplotlib.patches as patches
from PIL import Image
import numpy as np
image = np.array(Image.open('Image.jpg'), dtype=np.uint8)
# Create figure and axes
fig,ax = plt.subplots(1)
# Display the image
ax.imshow(image)
# Create a Rectangle patch
rect = patches.Rectangle((102,55),160,162,linewidth=1,edgecolor='r',facecolor='none')
# Add the patch to the Axes
ax.add_patch(rect)
plt.show()
图像输出:
以下函数在感兴趣区域周围绘制一个不完整的矩形。我为提供的每个点使用了两次 cv2.line()
。另外我还用了cv2.circle()
来标记4点。
只有一个限制条件。您必须按以下顺序提供 4 个点:左上角、左下角、右上角、右下角。
还有一个选项可以改变你想画的线的长度line_length
。
代码:
def draw_border(img, point1, point2, point3, point4, line_length):
x1, y1 = point1
x2, y2 = point2
x3, y3 = point3
x4, y4 = point4
cv2.circle(img, (x1, y1), 3, (255, 0, 255), -1) #-- top_left
cv2.circle(img, (x2, y2), 3, (255, 0, 255), -1) #-- bottom-left
cv2.circle(img, (x3, y3), 3, (255, 0, 255), -1) #-- top-right
cv2.circle(img, (x4, y4), 3, (255, 0, 255), -1) #-- bottom-right
cv2.line(img, (x1, y1), (x1 , y1 + line_length), (0, 255, 0), 2) #-- top-left
cv2.line(img, (x1, y1), (x1 + line_length , y1), (0, 255, 0), 2)
cv2.line(img, (x2, y2), (x2 , y2 - line_length), (0, 255, 0), 2) #-- bottom-left
cv2.line(img, (x2, y2), (x2 + line_length , y2), (0, 255, 0), 2)
cv2.line(img, (x3, y3), (x3 - line_length, y3), (0, 255, 0), 2) #-- top-right
cv2.line(img, (x3, y3), (x3, y3 + line_length), (0, 255, 0), 2)
cv2.line(img, (x4, y4), (x4 , y4 - line_length), (0, 255, 0), 2) #-- bottom-right
cv2.line(img, (x4, y4), (x4 - line_length , y4), (0, 255, 0), 2)
return img
line_length = 15
img = np.zeros((512,512,3), np.uint8)
cv2.imshow('img', img)
point1, point2, point3, point4 = (280,330), (280,390), (340,330), (340,390)
fin_img = draw_border(img, point1, point2, point3, point4, line_length)
cv2.imshow('fin_img', fin_img)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
此外,如果有人需要:在 C 中带有弯曲角的花式矩形: 但是我需要这个代码 python 社区回复了。
void draw_border(IplImage* show_img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness, int r, int d):
// Top left
cvLine(show_img, cvPoint( pt1.x +r, pt1.y), cvPoint( pt1.x + r + d, pt1.y), color, thickness, 8, 0 );
cvLine(show_img, cvPoint( pt1.x, pt1.y + r), cvPoint( pt1.x, pt1.y + r + d), color, thickness, 8, 0 );
cvEllipse(show_img, cvPoint(pt1.x +r, pt1.y + r), cvSize( r, r ), 180, 0, 90, color, thickness, 8, 0);
// Top right
cvLine(show_img, cvPoint( pt2.x - r, pt1.y), cvPoint( pt2.x - r - d, pt1.y), color, thickness, 8, 0 );
cvLine(show_img, cvPoint( pt2.x, pt1.y + r), cvPoint( pt2.x, pt1.y + r + d), color, thickness, 8, 0 );
cvEllipse(show_img, cvPoint(pt2.x -r, pt1.y + r), cvSize( r, r ), 270, 0, 90, color, thickness, 8, 0);
// Bottom left
cvLine(show_img, cvPoint( pt1.x + r, pt2.y), cvPoint( pt1.x + r + d, pt2.y), color, thickness, 8, 0);
cvLine(show_img, cvPoint( pt1.x, pt2.y - r), cvPoint( pt1.x, pt2.y - r - d), color, thickness, 8, 0);
cvEllipse(show_img, cvPoint(pt1.x + r, pt2.y - r), cvSize( r, r ), 90, 0, 90, color, thickness, 8, 0);
// Bottom right
cvLine(show_img, cvPoint( pt2.x - r, pt2.y), cvPoint( pt2.x - r - d, pt2.y), color, thickness, 8, 0);
cvLine(show_img, cvPoint( pt2.x, pt2.y - r), cvPoint( pt2.x, pt2.y - r - d), color, thickness, 8, 0);
cvEllipse(show_img, cvPoint(pt2.x - r, pt2.y - r), cvSize( r, r ), 0, 0, 90, color, thickness, 8, 0);