我正在使用网络摄像头监控功能修改程序。我必须添加一个从网络摄像头写入* .avi文件的功能。我在CMainForm类中添加了一些成员变量和代码。
下面的代码是添加成员变量;
CvVideoWriter* m_Writer;
IplImage* m_Image;
CvCapture* m_Capture;
bool m_bAviWriting; // Checks whether avi file is being written
我在单击“开始”按钮时修改了一个函数实现。我将局部变量替换为新的成员变量。
...
m_Capture = cvCaptureFromCAM(m_nCameraNumber);
if (m_Capture == NULL)
return FALSE;
m_Image = 0;
m_Image = cvQueryFrame(m_Capture);
m_Image = cvQueryFrame(m_Capture);
m_Image = cvQueryFrame(m_Capture);
// Create file
if (!m_bAviWriting) {
m_Capture = cvCaptureFromCAM(m_nCameraNumber);
m_Image = cvQueryFrame(m_Capture);
CvSize size = cvSize((int)cvGetCaptureProperty(m_Capture, CV_CAP_PROP_FRAME_WIDTH),
(int)cvGetCaptureProperty(m_Capture, CV_CAP_PROP_FRAME_HEIGHT));
m_Writer = cvCreateVideoWriter("writehere.avi", CV_FOURCC('D', 'V', 'I', 'X'), 30.0, size);
m_bAviWriting = true;
并添加了一个在CxxxView :: OnDraw()执行时执行的函数。
void CMainFrame::WriteAvi()
{
m_ImgForFile = cvQueryFrame(m_CaptureForFile);
if (!m_ImgForFile) return;
if (m_Writer == NULL) {
m_Writer = cvCreateVideoWriter("writehere.avi", CV_FOURCC('D', 'V', 'I', 'X'), 30.0, cvGetSize(m_ImgForFile), 1);
}
cvShowImage("rspWindow", m_ImgForFile);
cvWriteFrame(m_Writer, m_ImgForFile);
}
最后,在单击“停止”按钮时执行修改的函数。
if (m_bAviWriting) {
cvReleaseVideoWriter(&m_Writer);
cvReleaseCapture(&m_Capture);
m_bAviWriting = false;
}
当这个程序运行时,空白文件" writehere.avi"已创建,但内容未写入。在debbuging期间,我发现m_Writer实例始终具有null值,但我无法发现原因。