OpenCV保存視頻的操作

一、opencv保存視頻打不開

保存的視頻打不開可能是因為文件編碼格式不對,或者版本不兼容等原因。

檢查文件編碼格式,如果視頻保存為AVI格式,在保存的時候應該指定編碼器,並確保選擇的編碼器在本地系統上可用。如果視頻格式為mp4,需要檢查mp4格式的插件是否已經安裝好,並且擴展名保存為.mp4才能兼容。

示例代碼:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

二、opencv保存視頻mp4

mp4是一種常見的視頻格式,OpenCV同樣可以保存為mp4格式。mp4格式需要保證編碼器可用,推薦使用H264編碼器。

示例代碼:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘a’, ‘v’, ‘c’, ‘1’);
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.mp4”, fourcc, fps, size, true);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

三、opencv保存視頻變快

保存視頻變快可以通過控制幀率調整,適當提高幀率。

示例代碼:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 60;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(1) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

四、opencv保存視頻每一幀

可以通過遍歷每一幀,保存每一幀的方式將視頻保存成一個序列幀。

示例代碼:

“`
#include
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int frameCount = 0;
Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}

stringstream ss;
ss << "frame_" << frameCount << ".png";
imwrite(ss.str(), frame);
frameCount++;
imshow("frame", frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
destroyAllWindows();
return 0;
}
“`

五、Opencv保存視頻常見問題

問題一:保存視頻過大

可以通過調整幀率和分辨率降低視頻的大小。

示例代碼:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 15;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)) / 2, int(cap.get(CAP_PROP_FRAME_HEIGHT)) / 2);
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}

resize(frame, frame, size);
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

問題二:保存的視頻顯示是藍色的

保存的視頻顯示成藍色的場景可能是因為視頻的BGR三通道顏色順序和某些視頻播放器不一致導致的,建議使用其他播放器嘗試。

六、opencv保存視頻只有6kb

視頻只有6kb可能是保存格式不正確導致的。

示例代碼:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

int frameCount = writer.get(CAP_PROP_FRAME_COUNT);
if (frameCount == 0)
{
return 0;
}
return 0;
}
“`

七、opencv保存視頻python

OpenCV同樣可以使用Python進行視頻保存,類似的API接口,只是函數名不同。

示例代碼:

“`Python
import cv2

cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*’XVID’)
fps = 30
size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
out = cv2.VideoWriter(‘output.avi’, fourcc, fps, size)
while True:
ret, frame = cap.read()
if ret:
out.write(frame)
cv2.imshow(‘frame’, frame)
if cv2.waitKey(1) == 27:
break

cap.release()
out.release()
cv2.destroyAllWindows()
“`

八、Opencv保存視頻 buffer

為了避免保存視頻時出現buffer溢出,可以設置參數,提高緩衝區大小。

示例代碼:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘X’, ‘V’, ‘I’, ‘D’);
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size, true);

//需要增加的代碼
int buffersize = 50;
int framesize = writer.get(CAP_PROP_FRAME_WIDTH) * writer.get(CAP_PROP_FRAME_HEIGHT);
int bufferlength = buffersize * framesize;
writer.set(CAP_PROP_BUFFERSIZE, bufferlength);
//增加代碼結束

if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

九、opencv保存視頻後大小只有1kb

還是因為保存格式不正確導致的,可以嘗試更換編碼器。

示例代碼:

“`
#include
#include “opencv2/core.hpp”
#include “opencv2/highgui.hpp”
#include “opencv2/videoio.hpp”

using namespace std;
using namespace cv;

int main()
{
VideoCapture cap(0);
if (!cap.isOpened())
{
return 0;
}

int fourcc = VideoWriter::fourcc(‘M’, ‘J’, ‘P’, ‘G’); //換成MJPEG編碼器
int fps = 30;
Size size(int(cap.get(CAP_PROP_FRAME_WIDTH)), int(cap.get(CAP_PROP_FRAME_HEIGHT)));
VideoWriter writer(“output.avi”, fourcc, fps, size);
if (!writer.isOpened())
{
return 0;
}

Mat frame;
while (true)
{
cap >> frame;
if (frame.empty())
{
break;
}
writer.write(frame);
imshow(“frame”, frame);
if (waitKey(10) == 27)
{
break;
}
}

cap.release();
writer.release();
destroyAllWindows();
return 0;
}
“`

原創文章,作者:JELEB,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/368161.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
JELEB的頭像JELEB
上一篇 2025-04-12 01:12
下一篇 2025-04-12 01:13

相關推薦

  • 如何在PyCharm中安裝OpenCV?

    本文將從以下幾個方面詳細介紹如何在PyCharm中安裝OpenCV。 一、安裝Python 在安裝OpenCV之前,請確保已經安裝了Python。 如果您還沒有安裝Python,可…

    編程 2025-04-29
  • Python棧操作用法介紹

    如果你是一位Python開發工程師,那麼你必須掌握Python中的棧操作。在Python中,棧是一個容器,提供後進先出(LIFO)的原則。這篇文章將通過多個方面詳細地闡述Pytho…

    編程 2025-04-29
  • Python OpenCV 直線檢測

    本文將介紹在Python OpenCV中進行直線檢測的方法,主要涉及到圖像的邊緣檢測、霍夫變換和繪製直線等操作。 一、邊緣檢測 由於直線檢測是從圖像的邊緣開始的,因此必須先找到圖像…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • Python磁盤操作全方位解析

    本篇文章將從多個方面對Python磁盤操作進行詳細闡述,包括文件讀寫、文件夾創建、刪除、文件搜索與遍歷、文件重命名、移動、複製、文件權限修改等常用操作。 一、文件讀寫操作 文件讀寫…

    編程 2025-04-29
  • Python代碼實現迴文數最少操作次數

    本文將介紹如何使用Python解決一道經典的迴文數問題:給定一個數n,按照一定規則對它進行若干次操作,使得n成為迴文數,求最少的操作次數。 一、問題分析 首先,我們需要了解迴文數的…

    編程 2025-04-29
  • Python元祖操作用法介紹

    本文將從多個方面對Python元祖的操作進行詳細闡述。包括:元祖定義及初始化、元祖遍歷、元祖切片、元祖合併及比較、元祖解包等內容。 一、元祖定義及初始化 元祖在Python中屬於序…

    編程 2025-04-29
  • 如何用Python對數據進行離散化操作

    數據離散化是指將連續的數據轉化為離散的數據,一般是用於數據挖掘和數據分析中,可以幫助我們更好的理解數據,從而更好地進行決策和分析。Python作為一種高效的編程語言,在數據處理和分…

    編程 2025-04-29
  • Python列表的讀寫操作

    本文將針對Python列表的讀取與寫入操作進行詳細的闡述,包括列表的基本操作、列表的增刪改查、列表切片、列表排序、列表反轉、列表拼接、列表複製等操作。 一、列表的基本操作 列表是P…

    編程 2025-04-29

發表回復

登錄後才能評論