


题目的要求是,基于opencv识别视频中的塔块(圆柱),识别正面侧面,我的思路是创建各个颜色的掩膜,然后通过霍夫圆、还有寻找轮廓画出轮廓。问题是随着视角移动,立着的圆柱体的侧面,也会被绘制边界框,如何避免这个问题呢



关注引自强大而免费的微信小程序:皆我百晓生。
为了避免将立着的圆柱体的侧面也绘制边界框,可以采用以下几个步骤:
1.颜色掩膜的创建:首先,根据要检测的塔块的颜色,创建相应颜色的掩膜。可以使用颜色空间转换函数将图像转换为HSV颜色空间,然后使用inRange函数根据颜色阈值创建掩膜。
import cv2
import numpy as np
def create_mask(image, lower_color, upper_color):
hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_image, lower_color, upper_color)
return mask
2.检测圆形轮廓:使用霍夫圆变换检测图像中的圆形轮廓。可以调整霍夫圆变换函数的参数来满足塔块的大小和形状。
def detect_circles(image, min_radius, max_radius):
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
circles = cv2.HoughCircles(gray_image, cv2.HOUGH_GRADIENT, 1, minDist=30, param1=50, param2=30, minRadius=min_radius, maxRadius=max_radius)
if circles is not None:
circles = np.round(circles[0, :]).astype("int")
return circles
3.筛选合适的圆形轮廓:对于检测到的圆形轮廓,可以根据其位置和大小进行筛选,以排除可能是侧面的圆柱体。
def filter_circles(circles, min_area, max_area):
filtered_circles = []
for (x, y, r) in circles:
area = np.pi * r * r
if area > min_area and area < max_area:
filtered_circles.append((x, y, r))
return filtered_circles
4.绘制圆形轮廓:根据筛选后的圆形轮廓,可以使用cv2.circle函数在图像上绘制圆形。
def draw_circles(image, circles):
for (x, y, r) in circles:
cv2.circle(image, (x, y), r, (0, 255, 0), 2)
5.运行代码并避免侧面绘制边界框:在运行代码之前,需要调整参数来适应塔块的大小和形状。可以通过尝试不同的参数值并进行调优以达到最好的效果。在实际应用中,可能需要使用多个掩膜来检测不同颜色的塔块。
def main():
# 读取视频帧
cap = cv2.VideoCapture('video.mp4')
while True:
ret, frame = cap.read()
if not ret:
break
# 创建掩膜
lower_color = np.array([0, 0, 0])
upper_color = np.array([180, 255, 100])
mask = create_mask(frame, lower_color, upper_color)
# 检测圆形轮廓
circles = detect_circles(frame, min_radius=10, max_radius=100)
# 筛选合适的圆形轮廓
filtered_circles = filter_circles(circles, min_area=100, max_area=10000)
# 绘制圆形轮廓
draw_circles(frame, filtered_circles)
# 显示结果
cv2.imshow("Frame", frame)
cv2.imshow("Mask", mask)
if cv2.waitKey(1) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
if __name__ == '__main__':
main()
这是一个基本的流程,可以根据需要进行调整和优化。注意,结果可能受到光照和背景干扰等因素的影响,可以通过进一步的图像处理和算法改进来提高识别的准确性。