如何把左边倾斜车位也绘制矩形框,可以同时实现图中两种车位的检测。
1.调整检测框的位置和大小,使其同时包含左边倾斜车位和右边水平车位。
2.对于倾斜的车位,可以采用旋转矩形来进行检测。
举个例子,在Python中使用OpenCV进行车位检测的代码如下:
import cv2
#读取图像
img = cv2.imread('parking_lot.jpg')
#设置车位检测框的大小和位置
x, y, w, h = 270, 200, 350, 220
#截取图像中指定位置的区域
roi = img[y:y+h, x:x+w]
#将截取到的区域转化为灰度图像
gray = cv2.cvtColor(roi, cv2.COLOR_BGR2GRAY)
#使用Canny算子检测边缘
edges = cv2.Canny(gray, 50, 150)
#使用霍夫变换检测直线
lines = cv2.HoughLinesP(edges, 1, np.pi/180, 40, minLineLength=50, maxLineGap=5)
#遍历检测到的直线
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(roi, (x1, y1), (x2, y2), (0, 255, 0), 2)
#在原图中标记检测到的车位
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
#显示图像
cv2.imshow('Parking Lot Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上述代码中,我们利用了OpenCV中的 cv2.HoughLinesP 函数来检测直线。同时,我们也采用了一个矩形框来指定车位检测的区域。注意,这里的矩形框应该包含左边倾斜车位和右边水平车位。对于左边倾斜的车位,我们可以采用旋转矩形来进行检测,方法与检测直线类似。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
可以使用OpenCV中的cv2.rectangle()函数来绘制矩形框。对于左边倾斜的车位,可以先使用cv2.findContours()函数找到轮廓,然后使用cv2.minAreaRect()函数求得最小外接矩形,最后使用cv2.boxPoints()函数转化为四个顶点坐标,再将这四个顶点坐标传递给cv2.rectangle()函数来绘制矩形框。以下是详细实现步骤:
import cv2
img = cv2.imread("parking.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.int0(box)
# 判断最小外接矩形的长宽比是否在一定范围内,这里参数可以根据具体情况调整
if rect[1][0] / rect[1][1] > 2 and rect[1][0] / rect[1][1] < 4:
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
cv2.rectangle(img, (282, 425), (320, 457), (0, 255, 0), 2)
完整代码如下:
import cv2
import numpy as np
img = cv2.imread("parking.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
edges = cv2.Canny(gray, 100, 200)
contours, _ = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 遍历所有轮廓,找到左边倾斜车位的轮廓,并使用cv2.minAreaRect()函数求得最小外接矩形
for contour in contours:
rect = cv2.minAreaRect(contour)
box = cv2.boxPoints(rect)
box = np.int0(box)
# 判断最小外接矩形的长宽比是否在一定范围内,这里参数可以根据具体情况调整
if rect[1][0] / rect[1][1] > 2 and rect[1][0] / rect[1][1] < 4:
cv2.drawContours(img, [box], 0, (0, 0, 255), 2)
# 绘制右边车位的矩形框
cv2.rectangle(img, (282, 425), (320, 457), (0, 255, 0), 2)
cv2.imshow("Parking Detection", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
这样就可以同时实现图中两种车位的检测,效果如下图所示:

# 车位区域的最小外接矩形
rect1 = cv2.minAreaRect(np.array([(65, 355), (270, 210), (330, 265), (125, 410)]))
rect2 = cv2.minAreaRect(np.array([(360, 160), (480, 160), (480, 220), (360, 220)]))
# 获取倾斜矩形的四个角点
box1 = cv2.boxPoints(rect1).astype(int)
box2 = cv2.boxPoints(rect2).astype(int)
# 绘制矩形框
cv2.drawContours(img, [box1], 0, (0, 255, 0), 2)
cv2.drawContours(img, [box2], 0, (0, 0, 255), 2)
# 显示结果
cv2.imshow('Parking Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在上面的代码中,我们使用np.array函数来创建包含每个车位角点坐标的NumPy数组。然后,我们使用cv2.minAreaRect函数来获取车位区域的最小外接矩形。接下来,我们使用cv2.boxPoints函数计算这个矩形的四个角点,并将它们转换为整数类型。
最后,我们使用cv2.drawContours函数绘制矩形框。第一个参数是图像,第二个参数是角点的列表,第三个参数是要绘制的轮廓的索引(在这里我们只有一个),第四个参数是矩形框的颜色,第五个参数是线条的宽度。
运行代码后,您应该能够看到带有两个车位矩形框的图像。
你是需要帮你检测还是画图?
不知道你这个问题是否已经解决, 如果还没有解决的话:cv2.subtract(img1,img2)
img1-img2
黑色是0,减去黄色的值,肯定<0 而0是最小的值,所以背景是黑色的
img2-img1 cv2.subtract(img2,img1)