关于OpenCV视频录制的问题
opencv吧
全部回复
仅看楼主
level 2
#include "stdafx.h"
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>
using namespace cv;
int main(int argc, char** argv)
{
//声明IplImage指针
IplImage* pFrame = NULL;
IplImage* img;
//获取摄像头
CvCapture* pCapture = cvCreateCameraCapture(0);
//创建窗口
CvVideoWriter *writer_normal = NULL;
CvVideoWriter *writer_change = NULL;
int isColor = 1;
int fps = 25; // or 30
int frameW = 640; //
int frameH = 480;
//writer_normal = cvCreateVideoWriter("out_normal.avi", CV_FOURCC('X', 'V', 'I', 'D'), fps, cvSize(frameW, frameH), isColor);
//writer_change = cvCreateVideoWriter("out_change.avi", CV_FOURCC('X', 'V', 'I', 'D'), fps, cvSize(frameW, frameH), isColor);
writer_normal = cvCreateVideoWriter("out_normal.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, cvSize(frameW, frameH), isColor);
writer_change = cvCreateVideoWriter("out_change.avi", CV_FOURCC('M', 'J', 'P', 'G'), fps, cvSize(frameW, frameH), isColor);
//显示视屏
while (1)
{
pFrame = cvQueryFrame(pCapture);
cvShowImage("normal", pFrame);
cvGrabFrame(pCapture); // capture a frame
img = cvRetrieveFrame(pCapture); // retrieve the captured frame
cvWriteFrame(writer_normal, img);
// img = &IplImage(*pFrame);
IplImage * src = cvCreateImage(cvGetSize(img), 8, 1);
cvCvtColor(img, src, CV_BGR2GRAY);
IplImage *dst = cvCreateImage(cvGetSize(src), 8, 1);
IplImage *color_dst = cvCreateImage(cvGetSize(src), 8, 3);
cvCanny(src, dst, 50, 200, 3);
cvCvtColor(dst, color_dst, CV_GRAY2BGR);
CvMemStorage *storage = cvCreateMemStorage();
CvSeq *lines = 0;
lines = cvHoughLines2(dst, storage, CV_HOUGH_PROBABILISTIC, 1, CV_PI / 180, 80, 30, 5);
cvShowImage("change", dst);
cvWriteFrame(writer_change, dst); // add the frame to the file
waitKey(200);
}
cvReleaseImage(&pFrame);
cvReleaseImage(&img);
cvReleaseVideoWriter(&writer_normal);
cvReleaseVideoWriter(&writer_change);
cvReleaseCapture(&pCapture);
cvDestroyWindow("video");
}
程序的意图是用摄像头录像,将录像经过边缘提取和霍夫变换后输入到视频文件中。
程序将保存两个视频文件,write_normal保存的是原始视频文件,write_change保存的是经过处理之后的视频文件。
程序可以实时显示出两种视频图像。
但是为什么第一个视频也就是 cvWriteFrame(writer_normal, img);输出的视频可以播放
经过处理后的视频 也就是cvWriteFrame(writer_change, img);输出的视频永远只有5KB。
求大神解答,不胜感激。
2016年07月21日 01点07分 1
level 2
手动顶贴
2016年07月21日 13点07分 2
level 8
....你这个程序写的意思就是,每次取一帧,然后写入视频地址。问题是,你这是覆盖写啊,每次往视频里面覆盖写了一帧。
所以有2种解决方法,要么你找到追加写入视频的方法,每次采取追加写入视频。要么你将每一帧的图像保存在内存中,中断写入的时候将内存中的图像写入视频。
2016年07月28日 09点07分 3
level 9
楼上回答正确。你看看追加写怎么写。
2016年07月28日 14点07分 4
1