vs2008+opencv2.4.9 打开摄像头程序异常退出

vs2008+opencv2.4.9 打开摄像头程序异常退出,第1张

程序应该是在这两个地方出了问题:

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)

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8174337.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存