2010年5月28日金曜日

OpenCV:メモリにある画像データの取り扱い

OpenCVの例では主にファイルにある画像を取り扱うように出来ています。すでにメモリに画像が入っている時にはどうしたらいいのか考えました。メモリ上に512*512のバイト列(1画素8ビットのグレイレベルデータ)があるとします。OpenCV2.1では画像をMat(行列)型で扱えるので、下記のようにしました。

Mat *image1 = new Mat(512,512,CV_8UC1); //画像用Matインスタンスの作成 8bit
memcpy(image1->data, imagedata, 512*512); //画像データをimage1->dataに読み込む
           //imagedataは512*512バイトの画像列の先頭アドレス

Mat *image2 = new Mat(512,512,CV_8UC1); //画像用Matインスタンスの作成 8bit
memcpy(image2->data, imagedata2, 512*512); //画像データをimage1->dataに読み込む

Mat *difImg = new Mat(512,512,CV_8UC1);
absdiff((Mat &)*image2, (Mat &)*image1, (Mat &)*difImg); //差画像の作成

//以下、表示
namedWindow("img1", CV_WINDOW_AUTOSIZE);
cvMoveWindow("img1", 50, 50);
imshow("img1", (Mat &)*image1);
namedWindow("img2", CV_WINDOW_AUTOSIZE);
cvMoveWindow("img2", 580, 50);
imshow("img2", (Mat &)*image2);
namedWindow("dif", CV_WINDOW_AUTOSIZE);
cvMoveWindow("dif", 50, 600);
imshow("dif", (Mat &)*difImg);
namedWindow("dif*10", CV_WINDOW_AUTOSIZE);
cvMoveWindow("dif*10", 580, 600);
imshow("dif*10", (Mat &)*difImg2);
waitKey(0);
cvDestroyWindow ("img1");
cvDestroyWindow ("img2");
cvDestroyWindow ("dif");
cvDestroyWindow ("dif*10");

0 件のコメント: