OpenCV Photron - eiichiromomma/CVMLAB GitHub Wiki

(OpenCV) Photron

PhotronのFDM-PCIが発掘されたので試してみる。

APIが公開されていて、カラーモードを変更するだけで容易に利用できた。

基本動作

キャプチャして表示

fdmpciCapture()を実行すると、カレントフレームが随時更新される。 カレントフレームの取得はカラーモードをFDMPCI_RGB888_PACKとしておけば、cvCreateImageHeaderでヘッダのみ作成し、ImageDataへカレントフレームのポインタをchar *へキャストして渡すだけでIplImageとして利用できる。

下のソースではウェイト等一切気にせずcvWaitKeyのタイミングのみで再描画を行なう。

    #include <cv.h>
    #include <highgui.h>
    #include <Fdmpci.h>
    int main(void)
    {
      if (FDMPCI_ERROR==fdmpciInit()){
        return -1;
      }
      IplImage *src;
      src = cvCreateImageHeader(cvSize(640,480),IPL_DEPTH_8U,3);
      fdmpciSetStartPosition(1,0);
      fdmpciSelectSVHS(1);
      fdmpciSetColorMode(FDMPCI_RGB888_PACK);
      int key=0;
      cvNamedWindow("test",1);
      fdmpciCapture();
      while('q' != (key=cvWaitKey(10))){
        src->imageData = (char*)fdmpciGetBuffer();
        cvShowImage("test",src);
      }
      fdmpciExit();
      return 0;
    }

これだ表示だけなら問題無いが、同期しないのでフレーム画像は悲惨な状態になる。

動画像処理

cvBlobslibと組み合わせてみた。 キャプチャはfdmpciCaptureStart()で命令を出しておいて、事前に取得済みのフレームを処理と並行させると処理が速くなった。 但し、fdmpciIsCompleted()での確認が必要。

    #include <cv.h>
    #include <highgui.h>
    #include <Fdmpci.h>
    #include <BlobResult.h>

    int main(void)
    {
      if (FDMPCI_ERROR==fdmpciInit()){
        return -1;
      }
      IplImage *src;
      IplImage *src_gray;
      IplImage *src_clone;
      src = cvCreateImageHeader(cvSize(640,480),IPL_DEPTH_8U,3);
      src_gray = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,1);
      src_clone = cvCreateImage(cvSize(640,480),IPL_DEPTH_8U,3);
      CBlobResult blobs;
      CBlob nthBlob;
      int nblobs;
      //初期化
      fdmpciSetStartPosition(1,0);
      fdmpciSelectSVHS(1);
      fdmpciSetColorMode(FDMPCI_RGB888_PACK);
      int key=0;
      cvNamedWindow("test",1);
      //カレントフレームを埋める
      fdmpciCaptureStart();
      while(!fdmpciIsCompleted());
      //擬似Live処理1/30遅れる
      while('q' != (key=cvWaitKey(5))){
        //処理用の画像src_cloneへコピー
        src->imageData = (char*)fdmpciGetBuffer();
        cvCopyImage(src,src_clone);
        //fdmpciCaptureStart()を使って裏でキャプチャ開始(完了まで待たずに他の処理を先にやる)
        fdmpciCaptureStart();
        //src_cloneへの処理
        cvCvtColor(src_clone,src_gray,CV_BGR2GRAY);
        blobs = CBlobResult(src_gray, NULL, 60, false );
        blobs.Filter(blobs,B_INCLUDE,CBlobGetArea(), B_GREATER, 500);
        blobs.Filter(blobs,B_INCLUDE,CBlobGetCompactness(), B_LESS_OR_EQUAL, 2.0);
        nblobs = blobs.GetNumBlobs();
        for (int i=0; i<nblobs; i++){
          nthBlob = blobs.GetBlob(i);
          nthBlob.FillBlob(src_clone,CV_RGB(255,0,0),0,0);
        }
        cvShowImage("test",src_clone);
        blobs.ClearBlobs();
        //カレントフレームへのキャプチャが終わっていなければ待機
        while(!fdmpciIsCompleted());
      }

      fdmpciExit();
      return 0;
    }
⚠️ **GitHub.com Fallback** ⚠️