C- OPENCV捕获代码在系统函数中被调用时冻结



我正在开发OpenCV中的应用程序。我正在从相机上拍摄快照,然后关闭捕获。

在我的捕获代码(Capturecam1lowres.c)

下方
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <stdio.h>

int main(int argc, char* argv[])
{    
  CvCapture* camera = cvCreateCameraCapture(0); // Use the default camera
  IplImage*     frame = 0;
  cvSetCaptureProperty(camera,CV_CAP_PROP_FRAME_WIDTH,1024) ;
  cvSetCaptureProperty(camera,CV_CAP_PROP_FRAME_HEIGHT,768); 
  frame = cvQueryFrame(camera); //need to capture at least one extra frame
//  frame = cvQueryFrame(camera);
  if (frame != NULL) {
    printf("Frame extracted from CAM1nr");
        cvSaveImage("/home/root/Desktop/BBTCP/webcam1.jpg", frame,0);
  } else {
      printf("Null frame 1nr");
  }
  cvReleaseCapture(&camera);
  cvReleaseImage(&frame);
  return 0;
}

我正在称此代码的可执行文件 系统(./cauturecam1lowres)但是它在

中冻结
frame = cvQueryFrame(camera); 

有时(不是每次)。我如何为此子程序设置超时(cauturecam1lowres)。如果捕获需要太多时间,则应该放弃并退出。我该如何实现?

我尝试使用POSIX线程,但无法实现结果。在我的非工作螺纹代码下方。

#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
void *thread_function(void *arg) 
 {
    sleep(10);
    exit(0);
}
int main(int argc, char* argv[])
{    
  CvCapture* camera = cvCreateCameraCapture(0); // Use the default camera
  pthread_t mythread;
  IplImage*     frame = 0;
  if ( pthread_create( &mythread, NULL, thread_function, NULL) ) 
  {
    printf("error creating thread.");
    abort();
  }
  if ( pthread_join ( mythread, NULL ) ) 
  {
    printf("error joining thread.");
    abort();
  }

  cvSetCaptureProperty(camera,CV_CAP_PROP_FRAME_WIDTH,1024) ;
  cvSetCaptureProperty(camera,CV_CAP_PROP_FRAME_HEIGHT,768); 
  frame = cvQueryFrame(camera); //need to capture at least one extra frame
//  frame = cvQueryFrame(camera);
  if (frame != NULL) {
    printf("Frame extracted from CAM1nr");
        cvSaveImage("/home/root/Desktop/BBTCP/webcam1.jpg", frame,0);
  } else {
      printf("Null frame 1nr");
  }
  cvReleaseCapture(&camera);
  cvReleaseImage(&frame);
  return 0;
}

代码或系统设计中没有错误,但问题在嵌入式系统本身的DMA模块上。DMA批量转移的损坏会导致此错误。因此没有软件问题。

最新更新