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;
}