一、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-hk/n/368161.html