OpenCV Python VideoWriter दूषित वीडियो को बचाता है

Sep 16 2020

मैं वीडियो में फ़्रेम को संशोधित करने से पहले वीडियो की प्रतिलिपि बनाने का एक बहुत ही सरल उदाहरण प्राप्त करने का प्रयास कर रहा हूं। हालाँकि, output.avi वीडियो 2.8 mb बाधाओं की तुलना में 5kb दूषित फ़ाइल है ।avi वीडियो। मैं OpenCV संस्करण 4.2.0 और पायथन संस्करण 3.7.7 का उपयोग कर रहा हूं।

यहाँ कोड है:

import cv2

input = cv2.VideoCapture("../video/barriers.avi")
height = int(input.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(input.get(cv2.CAP_PROP_FRAME_WIDTH))

fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('../video/output5.avi', fourcc, 30, (height, width), isColor=True)

while input.isOpened():
    # get validity boolean and current frame
    ret, frame = input.read()

    # if valid tag is false, loop back to start
    if not ret:
        break
    else:
        out.write(frame)

input.release()
out.release()

अगर मैंने फ़्रेम का आकार मुद्रित किया है, तो मुझे मिलता है:

(480, 640, 3)

नोट: अन्य स्टैक ओवरफ्लो समाधानों में से किसी ने भी मदद नहीं की है।

संपादित करें: यदि cv2.imshow () का उपयोग किया जाता है तो सभी फ़्रेम ठीक प्रदर्शित होते हैं।

जवाब

3 Ahx Sep 16 2020 at 03:08

मैं आपके कोड में दो मुद्दों को संबोधित करना चाहूंगा:


अंक # 1:: आप एक.aviवीडियो फ़ाइलबनाना चाहते हैं। इसलिए आपको अपने फोरक को इनिशियलाइज़ करने की आवश्यकता हैMJPG:

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

वीडियो फ़ाइल बनाने के लिए कुछ संयोजन हैं। उदाहरण के लिए, यदि आप बनाना चाहते हैं तो आप .mp4अपने फोरक को इनिशियलाइज़ करें *'mp4v'।


अंक # 2: सुनिश्चित करें कि आउटपुट वीडियो का आकार इनपुट फ्रेम के समान है। उदाहरण के लिए: आपने अपने Videowriter ऑब्जेक्ट का आकार घोषित किया(height, width)। फिर आपका फ्रेम एक ही आकार का होना चाहिए:

frame = cv2.resize(frame, (height, width))

कोड:


import cv2

cap = cv2.VideoCapture("output.mp4")
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output5.avi', fourcc, 30, (width, height), isColor=True)

while cap.isOpened():
    # get validity boolean and current frame
    ret, frame = cap.read()

    # if valid tag is false, loop back to start
    if not ret:
        break
    else:
        frame = cv2.resize(frame, (width, height))
        out.write(frame)

cap.release()
out.release()