【问题标题】:Video crop with automatic specific contour recognition具有自动特定轮廓识别的视频裁剪
【发布时间】:2021-10-21 05:10:48
【问题描述】:

我需要一些关于项目的帮助。我的目的是用 OpenCV 和 python 裁剪超声检查视频,以便进一步处理它们。我正在寻找的功能是:

  1. 循环浏览文件夹中的所有可用视频
  2. 找到轮廓并裁剪
  3. 以一个固定大小和分辨率导出每个视频

现在我有点卡在轮廓查找和裁剪部分。我希望 OpenCV 能够自动识别超声检查形状周围的边界框,因为我知道所有视频都具有特定的圆锥形状。此外,如果可以去除不相关的杂乱,那就太好了。你能帮助我吗?附上你可以找到视频的一个原始帧和想要的结果。

import cv2
import numpy as np

cap = cv2.VideoCapture('video.mjpg')

# (x, y, w, h) = cv2.boundingRect(c)
# cv2.rectangle(frame, (x,y), (x+w, y+h), (0, 255, 0), 20)
# roi = frame[y:y+h, x:x+w]

while True:
    ret, frame = cap.read()
    # (height, width) = frame.shape[:2]
    sky = frame[0:100, 0:200]
    cv2.imshow('Video', sky)

    if cv2.waitKey(1) == 27:
        exit(0)

【问题讨论】:

    标签: python loops opencv video


    【解决方案1】:

    对于第一帧视频;你可以用它来检测图像的边界框,然后你可以裁剪它或任何你想要的:)

    import sys
    import cv2
    import numpy as np
    
    # Load our image
    dir = sys.path[0]
    org = cv2.imread(dir+'/im.png')
    im=org.copy()
    H,W=im.shape[:2]
    
    # Convert image to grayscale
    im=cv2.cvtColor(im,cv2.COLOR_BGR2GRAY)
    
    # remove noise
    im=cv2.GaussianBlur(im,(21,21),21)
    im=cv2.erode(im,np.ones((5,5)))
    
    # remove horizantal line
    im=cv2.GaussianBlur(im,(5,0),21)
    blr=im.copy()
    
    # make binary image
    im=cv2.threshold(im,5,255,cv2.THRESH_BINARY)[1]
    
    # draw black border around image to better detect blobs:
    cv2.rectangle(im,(0,0),(W,H),0,thickness=W//25)
    bw=im.copy()
    
    # Invert the black and white colors
    im=~im
    
    # Find contours and sort them by width
    cnts, _ = cv2.findContours(im, cv2.RETR_TREE, cv2.CHAIN_APPROX_NONE)
    cnts.sort(key=lambda x: cv2.boundingRect(x)[2],reverse=True)
    
    # Change the type and channels of image copies
    im=cv2.cvtColor(im,cv2.COLOR_GRAY2BGR)
    bw=cv2.cvtColor(bw,cv2.COLOR_GRAY2BGR)
    blr=cv2.cvtColor(blr,cv2.COLOR_GRAY2BGR)
    
    # Find the second biggest blob
    x, y, w, h = cv2.boundingRect(cnts[1])
    cv2.rectangle(org, (x, y), (x+w, y+h), (128, 0, 255), 10)
    cv2.rectangle(im, (x, y), (x+w, y+h), (128, 255, 0), 10)
    print(x,y,w,h)
    
    # Save final result
    top=np.hstack((blr,bw))
    btm=np.hstack((im,org))
    cv2.imwrite(dir+'/img_.png',np.vstack((top,btm)))
    

    Bounding-Box 区域:

    133 25 736 635
    

    剪切并保存最终图像:

    org = cv2.imread(dir+'/im.png')
    cv2.imwrite(dir+'/img_.png',org[y:y+h,x:x+w])
    

    【讨论】:

    • 感谢您的帮助。我可能遗漏了一些东西,但我不明白opencv如何识别边界框。我希望它能够自动识别它,因为并非每个视频都具有相同的大小或分辨率
    • 此代码用于自动检测:) 此方法不依赖于大小。但是,针对不同的情况,可能需要完成。
    • 你是对的,很明显。我非常感谢你,这就是我所需要的!!!!太棒了!
    猜你喜欢
    • 2016-07-12
    • 2023-04-02
    • 2021-02-01
    • 1970-01-01
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多