画像処理におけるマルチスレッドの利活用(OpenCV編):Linux版

画像処理におけるマルチスレッドの利活用(OpenCV編)ではWindows向けマルチスレッドプログラミングの紹介をしましたが,Linuxでも使えるよう,pthreadを用いたプログラムも紹介しておきます.

ここでは,HANDLEの代わりにpthread_t,CreateThread関数の代わりにpthread_create,WaitForSingleObjec関数の代わりにpthread_joinを使います.

#include <sys/types.h>
#include <pthread.h>
#include <cv.h>
#include <highgui.h>
#include <windows.h>
#include <cv.h>
#include <highgui.h>
// スレッドに渡すデータをまとめた構造体
struct captureparam{
CvCapture *capture;
IplImage *temp;
};
// スレッドで実行する処理(画像のキャプチャ)
void capturethread(struct captureparam* cap){
cap->temp = cvQueryFrame (cap->capture);
}
int main(int argc, char *argv[]){
CvCapture *capture=NULL; // キャプチャ用の構造体
IplImage *temp=NULL;     // 画像(撮影予約用「temp画像」)
IplImage *img=NULL;      // 画像(実際の処理で使う「画像」)
// GUIの初期化
cvInitSystem(argc,argv);
cvNamedWindow("captured",CV_WINDOW_AUTOSIZE);
// キャプチャ用構造体の初期化
capture = cvCreateCameraCapture (0);
// 1枚目の画像の準備
temp = cvQueryFrame (capture);
img=cvCloneImage(temp);
// スレッドに渡すデータの準備
struct captureparam cap;
cap->cam=capture;
cap->temp=temp;
// メインループ
while((char)cvWaitKey(10)!='q'){
// “撮影予約”処理.スレッド作成し,ハンドルを保持する
pthread_t thread;
pthread_create( &thread, NULL, capturethread, cap );
// ここから img を使った時間のかかる画像処理
// このとき,tempの方をいじってはいけません
cvShowImage("captured",img);
// ここまで
// 先ほど撮影予約した処理が終わっているか?
//(撮影が終わるまで待つ)
// スレッドはさようなら
pthread_join( thread, NULL );
// 撮影した「temp画像」を処理で使う「画像」へコピー
cvReleaseImage(&img);
img=cvCloneImage(temp);
}
// いろいろ終了処理
cvReleaseCapture (&capture);
cvDestroyWindow("captured");
cvReleaseImage(&img);
return 0;
}

これも動作確認等は行っておりませんので動作は保障できません*1

*1:間違っているところ等がある場合は教えてください.

コメントする