dポイントプレゼントキャンペーン実施中!

opencvを使って画像比較をしたいです。
具体的には、デスクトップの背景の一部分(4×4bitくらい)が、画面上にあれば処理を実行する、みたいにしたいです。(他のウィンドウなどで隠れていたら実行しない)
具体的にどのような関数を使えば作れますか?
テンプレートマッチングという方法でいけそうなのですが、一旦プリントスクリーンキーなどで画面を保存して、それと切り取った4×4の画像を比較していく。のような感じにすればいいのでしょうか?
そのような関数はあるのでしょうか?
それと画面を一瞬で保存して、IplImageに保存する。みたいな関数はありますか?
下手くそな日本語ですが回答よろしくお願いします・・。

A 回答 (1件)

こんにちは.



テンプレートマッチングにはcvMatchTemplateを使います.
具体的には以下のページを参考にしてみて下さい.

関数:
http://opencv.jp/opencv-1.0.0/document/opencvref …

サンプルソース:
http://opencv.jp/sample/matching.html

また,マッチング元画像を得る方法ですけど,
OpenCVにはスクリーンキャプチャを行う関数はたしか無かったと思います.
ですので,win32apiなどを用いてスクリーンキャプチャを行い,
得られるビットマップをIplImageに変換するのが良いと思います.

スクリーンキャプチャを行ってOpenCVで画像を表示する例:
--

#include <windows.h>
#include <wingdi.h>
#include <string.h>
#include <cv.h>
#include <highgui.h>
#include <iostream>

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

--

以上,参考になりましたら幸いです.
    • good
    • 0
この回答へのお礼

回答ありがとうございます!
表示はできました! 
が、DIBやDDB、デバイスコンテキストやメモリデバイスコンテキストなど・・ わからないことだらけです(汗
変数もhbitmaoやbitmapの違いもわかりませんし、色々勉強しなければならないようです。
ありがとうございました。

お礼日時:2011/10/08 23:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!