程序应该是在这两个地方出了问题:
if (capture == NULL) {
printf("No camera detected!\n")
exit(-1)
}
if (img == NULL) {
printf("Camera detected, but grab image error!\n")
exit(-1)
}
第一段的作用是判断摄像头有没有启动成功,第二段的作用是在判断有没有从摄像头读到图像。
“CvCapture* capture = cvCaptureFromCAM(-1)”这件话的作用是打开摄像头。
因为摄像头启动和图像读取都需要一定的时间,所以程序运行到这两个判断步时,摄像头可能还没有启动或者启动后获取的图像还未能传输到相应位置,进而会触发相应判断条件而执行“exit(-1)”,引起程序异常退出。
你可以在调试程序时分别在这两个判断语句中设置断点来验证是不是该处出现了问题。
如果问题是出现在这里,解决方法如下:
把两个判断条件段改为
while(1)
{
if (capture !=NULL)
break
}
和
while(1)
{
if (img!=NULL)
break
}
如果问题不是出现在这里,欢迎继续交流。(我也是刚接触opencv,遇到过类似的问题。回答若有不准确的地方请包涵并指出。)
1.写XMl文件,void CrecognitionDlg::storeDirectoryFaces(){
CvFileStorage * fileStorage
fileStorage = cvOpenFileStorage( "directoryInfo.xml", 0, CV_STORAGE_WRITE )
cvWriteInt( fileStorage, "nFaces", indexFaces.size() )
cvStartWriteStruct(fileStorage, "CVFaceRecog", CV_NODE_MAP)
for (size_t i=0i<indexFaces.size()i++)
{
char person[100]
sprintf( person, "person_%d", (i+1) )//必须区分开,否则读的时候会出问题
cvStartWriteStruct(fileStorage,person, CV_NODE_MAP)
cvWriteInt( fileStorage, "index", indexFaces.at(i) )
cvWriteString(fileStorage, "name", namePerson.at(i))
cvWriteString(fileStorage, "directory", pathFaces.at(i))
cvEndWriteStruct(fileStorage)
}
cvEndWriteStruct(fileStorage)
cvReleaseFileStorage( &fileStorage )
}
写完的内容如下:
<?xml version="1.0"?>
<opencv_storage>
<nFaces>3</nFaces>
<CVFaceRecog>
<person_1>
<index>0</index>
<name>aaa</name>
<directory>C:\Pictures\kobe</directory></person_1>
<person_2>
<index>1</index>
<name>bbb</name>
<directory>C:\Pictures\Li</directory></person_2>
<person_3>
<index>2</index>
<name>ccc</name>
<directory>C:\Pictures\Sun</directory></person_3></CVFaceRecog>
</opencv_storage>
2.读XML
int CrecognitionDlg::loadDirectoryFaces(){
CvFileStorage * fileStorage = NULL
int i
CvSeq* seq
CvSeqReader reader
fileStorage = cvOpenFileStorage( "directoryInfo.xml", 0, CV_STORAGE_READ )
if( !fileStorage ) {
return 0
}
namePerson.clear()
pathFaces.clear()
indexFaces.clear()
CvFileNode* root = cvGetRootFileNode( fileStorage, 0)
CvFileNode* data = cvGetFileNodeByName( fileStorage, root, "CVFaceRecog" )
seq = data->data.seq
cvStartReadSeq( seq, &reader, 0 )
int nFaces = cvReadIntByName( fileStorage, 0, "nFaces", 0 )
for(i = 0 i < nFaces i++)
{
CvFileNode *pt = (CvFileNode*)reader.ptr
namePerson.push_back(cvReadStringByName(fileStorage, pt, "name", 0))
pathFaces.push_back(cvReadStringByName(fileStorage, pt, "directory", 0))
indexFaces.push_back(cvReadIntByName(fileStorage,pt,"index",0))
CV_NEXT_SEQ_ELEM(seq->elem_size, reader)
}
cvReleaseFileStorage( &fileStorage )
return 0
}
参照
http://www.360doc.com/content/10/1214/23/3843418_78215161.shtml
下载安装VirtualDub v1.9.4,照说明转码avi视频,转码成功的是一个很大的avi视频文件。
接下来使用的话如果可以用就好了,如果还是不能解决的话我告诉你,将取视频地址如“D:\f.avi”换成“D:\\f.avi”.这大概是vc6.0的“\”要用“\\”代替的,具体为什么我就不解释了,任何课本上都有的。
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <cv.h>
#include <highgui.h>
int g_slider_position = 0
CvCapture* g_capture = NULL
void onTrackbarSlide(int pos)
{
cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos)
}
int main(int argc, char** argv)
{
int frames
IplImage* frame
cvNamedWindow("D:\\f.avi", CV_WINDOW_AUTOSIZE)
g_capture = cvCreateFileCapture("D:\\f.avi")
frames = (int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT)
if(frames!=0)
{
cvCreateTrackbar("D:\\Position.avi","D:\\f.avi", &g_slider_position,frames,onTrackbarSlide)
}
while(1)
{
frame = cvQueryFrame(g_capture)
if(!frame) break
cvShowImage("D:\\f.avi", frame)
if(cvWaitKey(33) >= 0) break
//char c = cvWaitKey(33)
//if(c == 27) break
}
cvReleaseCapture(&g_capture)
cvDestroyWindow("D:\\f.avi")
return(0)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)