2

OpenCV ライブラリで実行されるキャプチャ コードを実装しました。2 台のカメラから順番にコードをキャプチャします。しかし、コードはしばらくするとメモリ割り当てエラーを引き起こします。

camera2 のキャプチャ ストリームを開くには、camera1 のキャプチャ ストリームを解放する必要があります。2つ同時にキャプチャーできなかったので、順番にキャプチャーする必要があります。

このシナリオでメモリ割り当てエラーが発生するのはなぜですか?

私のコードは以下にあります:

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

  CvCapture* camera; // Use the default camera
  IplImage*     frame;

int main(int argc, char* argv[])
{    

     while(1)
     {
      camera = cvCreateCameraCapture(0); // Use the default camera
      //camera2 = cvCreateCameraCapture(1); // Use the default camera
      frame = 0;
      //frame2 = 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

      if (frame != NULL) {
        printf("Frame extracted from CAM1\n\r");
            cvSaveImage("/dev/shm/webcam1.jpg", frame,0);
        printf("Frame from CAM1 saved\n\r");
      } else {
          printf("Null frame 1\n\r");
      }

      cvReleaseImage(&frame);
      cvReleaseCapture(&camera);

      camera = cvCreateCameraCapture(1); // Use the default camera

      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

      if (frame != NULL) {
        printf("Frame extracted from CAM2\n\r");
            cvSaveImage("/dev/shm/webcam2.jpg", frame,0);
        printf("Frame from CAM2 saved\n\r");
      } else {
          printf("Null frame 2\n\r");
      }
      cvReleaseImage(&frame);
      cvReleaseCapture(&camera);
    }
4

1 に答える 1

0

まず、while() ステートメントから cameraCapture の宣言を開始できます。

 camera0 = cvCreateCameraCapture(0);
 camera1 = cvCreateCameraCapture(1);
 frame0 = 0;
 frame1 = 0;
 cvSetCaptureProperty(camera0,CV_CAP_PROP_FRAME_WIDTH,1024) ;
 cvSetCaptureProperty(camera0,CV_CAP_PROP_FRAME_HEIGHT,768);
 cvSetCaptureProperty(camera1,CV_CAP_PROP_FRAME_WIDTH,1024) ;
 cvSetCaptureProperty(camera1,CV_CAP_PROP_FRAME_HEIGHT,768); 

 while(1) {
     /* your operation */
     frame0 = cvQueryFrame(camera0);
     frame1 = cvQueryFrame(camera1);
     /* your operation */
 }

 cvReleaseImage(&frame0);
 cvReleaseImage(&frame1);
 cvReleaseCapture(&camera0);
 cvReleaseCapture(&camera1);

編集

最初のストリームを A-cam から取得し、次に B-cam から取得する場合は、次のようなコードになります。何をしたいのか正確にはわからないので、このコードはストリームをウィンドウに表示するだけです。cvShowImage()からの描画要求を処理する時間を highgui に与えるために、cvWaitKey(...)を使用することを忘れないでください。また、cvSetCapturePropertyのドキュメントを参照してください。現在、この関数はビデオ ファイルのみをサポートしていると書かれています。

  • CV_CAP_PROP_POS_MSEC;
  • CV_CAP_PROP_POS_FRAMES;
  • CV_CAP_PROP_POS_AVI_RATIO.

ちなみに私のお勧めはこれです。

const char* wndName = "window";
cvNamedWindow(wndName, CV_WINDOW_NORMAL);

IplImage* frame;
CvCapture* capture;

while(true) {
  capture = cvCaptureFromCAM(0);

  /* Showing for a while capture in window */
  while(/* your condition */) {
    frame = cvQueryFrame(capture);
    /* operation with A cam */
    cvShowImage(wndName, frame);
    cvWaitKey(30);
  }

  cvReleaseCapture(&capture);
  cvWaitKey(100);
  /* switching source cam */
  capture = cvCaptureFromCAM(1);

  /* Showing for a while capture in the same window */
  while(/* your condition */) {
    frame = cvQueryFrame(capture);
    /* operation with B cam */
    cvShowImage(wndName, frame);
    cvWaitKey(30);
  }
} 
cvReleaseImage(&frame); 
cvReleaseCapture(&capture);

これは私にとってはうまくいきます。フィードバックがあれば教えてください。

于 2012-12-10T16:31:25.880 に答える