OpenCV捕获代码在系统函数中调用时会冻结

时间:2012-10-19 06:18:45

标签: c opencv pthreads system

我正在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 CAM1\n\r");
        cvSaveImage("/home/root/Desktop/BBTCP/webcam1.jpg", frame,0);
  } else {
      printf("Null frame 1\n\r");
  }
  cvReleaseCapture(&camera);
  cvReleaseImage(&frame);
  return 0;
}

我从中调用此代码的可执行文件     系统(./ capturecam1lowres)

冻结了
frame = cvQueryFrame(camera); 

有时(不是每次都行)。如何为此子程序设置超时(capturecam1lowres)。如果捕获花费太多时间,它应该放弃并退出。我怎样才能做到这一点?

我尝试使用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 CAM1\n\r");
        cvSaveImage("/home/root/Desktop/BBTCP/webcam1.jpg", frame,0);
  } else {
      printf("Null frame 1\n\r");
  }
  cvReleaseCapture(&camera);
  cvReleaseImage(&frame);
  return 0;
}

1 个答案:

答案 0 :(得分:0)

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