OpenCV VideoWriter write() 函数在 C++ 中的 MAC OS 上失败
OpenCV VideoWriter write() function fails on MAC OS in C++
我是新手。我正在研究 OpenCV。我正在尝试使用 OpenCV 读写视频文件。我的代码是:
VideoCapture inputVideo("input.avi");
if (!inputVideo.isOpened())
{
std::cout << "!!! Input video could not be opened" << std::endl;
return -1;
}
// Setup output video
VideoWriter output_cap("output.avi",
inputVideo.get(CV_CAP_PROP_FOURCC),
inputVideo.get(CV_CAP_PROP_FPS),
cv::Size(inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT)),1);
Mat frame;
output_cap.open("/private/var/root/Desktop/output.avi",
inputVideo.get(CV_CAP_PROP_FOURCC),
inputVideo.get(CV_CAP_PROP_FPS),
cv::Size(inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT)),1);
while (true)
{
if (!inputVideo.read(frame))
break;
imshow("title",frame);
waitKey(100);
output_cap.write(frame);
}
现在我的问题是:当我尝试使用 output_cap.write(frame) 编写帧时,我的输出视频文件只有 8kb 文件。但是用于查看框架的 imshow("title",frame) 函数工作正常并按顺序查看所有框架。你能告诉我我做错了什么吗?
mac os x 没有 videoWriter。您可以将它们保存为 jpeg,然后使用 ffmpeg 拼接它们。
如果您使用 brew 安装了 OpenCV,请尝试使用 brew install opencv --with-ffpmeg
重新安装它。
我使用其他 fourcc 代码解决了它:8BPS 和 SVQ3。
我遇到了类似的问题。当我尝试使用 mac 的网络摄像头录制视频时
imshow("title",frame)
查看框架的功能工作正常。但是当我尝试使用
编写框架时
output_cap.write(frame)
我只有 8kb(正好 414 字节)的文件作为我的输出视频文件。
我试了很多方法都没有用。终于安装了ffmpeg,还是不行
但是当我在终端中输入 ffmpeg -codecs 时,我看到了 "QuickTime video"。然后我去了 fourcc.org 并查找 "Quicktime"。我得到了:8BPS、AVRN、RPZA、SV10、SVQ3 和 ZYGO。
我都试过了,只有两个有效:8BPS和SVQ3。
我的代码是:
import cv2
import time
filename = time.strftime("%m-%d-%H-%M-%S") + '.avi'
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
size = (int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
fps = 16
fourcc = cv2.cv.FOURCC('X', 'V', 'I', 'D') #does not work
fourcc0 = cv2.cv.FOURCC('D', 'I', 'V', 'X') #does not work
fourcc1 = cv2.cv.FOURCC('M', 'J', 'P', 'G') #does not work
fourcc2 = cv2.cv.FOURCC('8', 'B', 'P', 'S') #works, large
fourcc3 = cv2.cv.FOURCC('A', 'V', 'R', 'N') #does not work
fourcc4 = cv2.cv.FOURCC('R', 'P', 'Z', 'A') #does not work
fourcc5 = cv2.cv.FOURCC('S', 'V', '1', '0') #does not work
fourcc6 = cv2.cv.FOURCC('S', 'V', 'Q', '3') #works, small
fourcc7 = cv2.cv.FOURCC('Z', 'Y', 'G', 'O') #does not work
out = cv2.VideoWriter(filename, fourcc6, fps, size, True)
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break;
else:
print 'Error...'
break;
cap.release()
out.release()
cv2.destroyAllWindows()
我是新手。我正在研究 OpenCV。我正在尝试使用 OpenCV 读写视频文件。我的代码是:
VideoCapture inputVideo("input.avi");
if (!inputVideo.isOpened())
{
std::cout << "!!! Input video could not be opened" << std::endl;
return -1;
}
// Setup output video
VideoWriter output_cap("output.avi",
inputVideo.get(CV_CAP_PROP_FOURCC),
inputVideo.get(CV_CAP_PROP_FPS),
cv::Size(inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT)),1);
Mat frame;
output_cap.open("/private/var/root/Desktop/output.avi",
inputVideo.get(CV_CAP_PROP_FOURCC),
inputVideo.get(CV_CAP_PROP_FPS),
cv::Size(inputVideo.get(CV_CAP_PROP_FRAME_WIDTH), inputVideo.get(CV_CAP_PROP_FRAME_HEIGHT)),1);
while (true)
{
if (!inputVideo.read(frame))
break;
imshow("title",frame);
waitKey(100);
output_cap.write(frame);
}
现在我的问题是:当我尝试使用 output_cap.write(frame) 编写帧时,我的输出视频文件只有 8kb 文件。但是用于查看框架的 imshow("title",frame) 函数工作正常并按顺序查看所有框架。你能告诉我我做错了什么吗?
mac os x 没有 videoWriter。您可以将它们保存为 jpeg,然后使用 ffmpeg 拼接它们。
如果您使用 brew 安装了 OpenCV,请尝试使用 brew install opencv --with-ffpmeg
重新安装它。
我使用其他 fourcc 代码解决了它:8BPS 和 SVQ3。
我遇到了类似的问题。当我尝试使用 mac 的网络摄像头录制视频时
imshow("title",frame)
查看框架的功能工作正常。但是当我尝试使用
编写框架时output_cap.write(frame)
我只有 8kb(正好 414 字节)的文件作为我的输出视频文件。
我试了很多方法都没有用。终于安装了ffmpeg,还是不行
但是当我在终端中输入 ffmpeg -codecs 时,我看到了 "QuickTime video"。然后我去了 fourcc.org 并查找 "Quicktime"。我得到了:8BPS、AVRN、RPZA、SV10、SVQ3 和 ZYGO。
我都试过了,只有两个有效:8BPS和SVQ3。
我的代码是:
import cv2
import time
filename = time.strftime("%m-%d-%H-%M-%S") + '.avi'
cap = cv2.VideoCapture(0)
cap.set(3, 640)
cap.set(4, 480)
size = (int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_WIDTH)),
int(cap.get(cv2.cv.CV_CAP_PROP_FRAME_HEIGHT)))
fps = 16
fourcc = cv2.cv.FOURCC('X', 'V', 'I', 'D') #does not work
fourcc0 = cv2.cv.FOURCC('D', 'I', 'V', 'X') #does not work
fourcc1 = cv2.cv.FOURCC('M', 'J', 'P', 'G') #does not work
fourcc2 = cv2.cv.FOURCC('8', 'B', 'P', 'S') #works, large
fourcc3 = cv2.cv.FOURCC('A', 'V', 'R', 'N') #does not work
fourcc4 = cv2.cv.FOURCC('R', 'P', 'Z', 'A') #does not work
fourcc5 = cv2.cv.FOURCC('S', 'V', '1', '0') #does not work
fourcc6 = cv2.cv.FOURCC('S', 'V', 'Q', '3') #works, small
fourcc7 = cv2.cv.FOURCC('Z', 'Y', 'G', 'O') #does not work
out = cv2.VideoWriter(filename, fourcc6, fps, size, True)
while(cap.isOpened()):
ret, frame = cap.read()
if ret == True:
out.write(frame)
cv2.imshow('frame', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break;
else:
print 'Error...'
break;
cap.release()
out.release()
cv2.destroyAllWindows()