小卷心菜865 2023-11-13 20:24 采纳率: 0%
浏览 11
已结题

关于#opencv#的问题:基于opencv识别视频中的塔块(圆柱),我的思路是创建各个颜色的掩膜,然后通过霍夫圆、还有寻找轮廓画出轮廓

img

img

img


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

  • 写回答

14条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-11-13 20:24
    关注
    获得0.60元问题酬金

    引自强大而免费的微信小程序:皆我百晓生

    为了避免将立着的圆柱体的侧面也绘制边界框,可以采用以下几个步骤:

    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()
    

    这是一个基本的流程,可以根据需要进行调整和优化。注意,结果可能受到光照和背景干扰等因素的影响,可以通过进一步的图像处理和算法改进来提高识别的准确性。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 11月21日
  • 创建了问题 11月13日