我试图在C中创建一个简单的Opencv程序,它从.avi创建一个文件捕获,并在一个突出显示面的窗口中播放它。我正在运行Opencv的自编译版本(我已经尝试过使用jpeg图像并且它可以工作)。
构建顺利,没有错误,没有警告,但是当我启动它时,控制台输出:
遇到未知参数:"服务器角色" 忽略未知参数"服务器角色"
程序只是停止
以前它抱怨缺少/home/#user/.smb/smb.conf文件,所以我尝试安装samba(尽管我仍然不知道samba在这一切中必须做什么)
这是我的代码:
的main(){
printf("Ciao!");
cvNamedWindow("window", CV_WINDOW_AUTOSIZE);
cvWaitKey(0);
printf("ok");
CvCapture* capture = cvCreateFileCapture("monsters.avi");
CvHaarClassifierCascade* cascade = load_object_detector("haarcascade_frontalface_alt.xml");
CvMemStorage* storage = cvCreateMemStorage(0);
//List of the faces
CvSeq* faces;
while (0<10) {
CvArr* image = cvQueryFrame(capture);
double scale = 1;
faces = cvHaarDetectObjects(image,cascade, storage, 1.2, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize(1,1), cvSize(300,300));
int i;
for(i = 0; i < faces->total; i++ )
{
CvRect face_rect = *(CvRect*)cvGetSeqElem( faces, i );
cvRectangle( image,
cvPoint(face_rect.x*scale,face_rect.y*scale),
cvPoint((face_rect.x+face_rect.width)*scale,(face_rect.y+face_rect.height)*scale),
CV_RGB(255,0,0) , 3, 8, 0);
}
cvReleaseMemStorage( &storage );
cvShowImage("window", image);
}
cvWaitKey(0);
printf("Ciao!");
}
我感谢你的回答,我转而使用C ++进行试验。现在我这样做了:
int main(){
namedWindow("Video", CV_WINDOW_FREERATIO);
VideoCapture cap("sintel.mp4");
if(!cap.isOpened()) // check if we succeeded
return -1;
Mat edges;
for(;;){
Mat frame;
cap>>frame;
cvtColor(frame, edges, CV_BGR2GRAY);
GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
Canny(edges, edges, 0, 30, 3);
imshow("Video", edges);
//cvWaitKey(0);
}
return(0);
}
现在它成功加载了视频并查询了一个帧,逐渐显示我按下一个键它显然查询另一帧并且一切正常,但如果我评论waitkey()程序只是挂起一点并且如果我尝试崩溃关闭窗口,我开始认为编解码器或类似的东西有问题...
答案 0 :(得分:0)
代码中存在这么多潜在问题,其中大多数与防御性编码无关。
cvWaitKey(0);
后cvNamedWindow()
做什么?这是不必要的,删除它!
如果捕获不成功会怎样?防守代码:
CvCapture * capture = cvCreateFileCapture(“monsters.avi”); if(!capture) { //找不到文件,处理错误并可能退出应用程序 }
你应该对从OpenCV收到的每个指针使用这种技术,好吗?
其中一个主要问题是你在循环之前为CvMemStorage
分配内存,但是在循环内你释放它,这意味着在第一次循环迭代之后将不再有效{{1这是一个巨大的问题。
将分配过程移动到循环的开头,因此在每次迭代时都会分配/取消分配内存,或者将CvMemStorage* storage
调用移出循环。
答案 1 :(得分:0)
现在它工作正常,我用这个
改变了cvWaitKey() if(waitKey(30) >= 0) break;
我不明白为什么,但现在一切正常,但