具有自动特定轮廓识别的视频裁剪

Video crop with automatic specific contour recognition

我需要一些项目帮助。我的目的是使用 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)

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

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

边界框区域:

133 25 736 635

剪切并保存最终图像:

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