質問: opencvを使って画像比較 opencvを使って画像比較をしたいです。 具体的には、デスクトップの背景の一部分(4×4bitくらい)が、画面上にあれば処理を実行する、みたいにしたいです。(他のウィンドウなどで隠れていたら実行しない) 具体的にどのような関数を使えば作れますか? テンプレートマッチングという方法でいけそうなのですが、一旦プリントスクリーンキーなどで画面を保存して、それと切り取った4×4の画像を比較していく。のような感じにすればいいのでしょうか? そのような関数はあるのでしょうか? それと画面を一瞬で保存して、iplimageに保存する。みたいな関数はありますか? 下手くそな日本語ですが回答よろしくお願いします・・。
回答: こんにちは. テンプレートマッチングにはcvmatchtemplateを使います. 具体的には以下のページを参考にしてみて下さい. 関数: http://opencv.jp/opencv-1.0.0/document/opencvref_cv_matching.html サンプルソース: http://opencv.jp/sample/matching.html また,マッチング元画像を得る方法ですけど, opencvにはスクリーンキャプチャを行う関数はたしか無かったと思います. ですので,win32apiなどを用いてスクリーンキャプチャを行い, 得られるビットマップをiplimageに変換するのが良いと思います. スクリーンキャプチャを行ってopencvで画像を表示する例: #include #include #include #include #include #include int main( int argc, char **argv) { hwnd desktop; rect rc; hdc hdc; bitmapinfo bmpinfo; lpdword lppixel; hdc hmemdc; hbitmap hbitmap; bitmap bmbitmap; int width, height; iplimage *convertiplimg; // スクリーンの情報を得る desktop=getdesktopwindow(); getwindowrect(desktop,&rc); width=rc.right; height=rc.bottom; // dibの情報を設定する bmpinfo.bmiheader.bisize=sizeof(bitmapinfoheader); bmpinfo.bmiheader.biwidth=width; bmpinfo.bmiheader.biheight=height; bmpinfo.bmiheader.biplanes=1; bmpinfo.bmiheader.bibitcount=32; bmpinfo.bmiheader.bicompression=bi_rgb; // dibsection作成 hdc=getdc(desktop); hbitmap=createdibsection(hdc,&bmpinfo,dib_rgb_colors,(void**)&lppixel,null,0); hmemdc=createcompatibledc(hdc); selectobject(hmemdc,hbitmap); // スクリーンをdibsectionにコピー hdc=getdc(desktop); bitblt(hmemdc,0,0,width,height,hdc,0,0,srccopy); releasedc(desktop,hdc); // ビットマップ情報の取得 getobject(hbitmap, sizeof(bitmap), &bmbitmap); // bitmap構造体からiplimageへコピー convertiplimg = cvcreateimage(cvsize(width, height), ipl_depth_8u, 4); memcpy(convertiplimg->imagedata, bmbitmap.bmbits, width*height*4); cvflip(convertiplimg, convertiplimg, 0); // opencvウィンドウの作成&画像の表示 cvnamedwindow("desptop image", cv_window_autosize); cvshowimage("desptop image", convertiplimg); // 何かキー入力を待つ cvwaitkey(0); // 終了処理 cvdestroywindow("desptop image"); cvreleaseimage(&convertiplimg); deletedc(hmemdc); deleteobject(hbitmap); postquitmessage(0); return 0; } 以上,参考になりましたら幸いです.