-PR-
解決済み

opencvを使って画像比較

  • 困ってます
  • 質問No.7001914
  • 閲覧数3876
  • ありがとう数2
  • 気になる数0
  • 回答数1
  • コメント数0

お礼率 23% (23/96)

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

質問者が選んだベストアンサー

  • 回答No.1
レベル12

ベストアンサー率 53% (288/542)

こんにちは.

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

関数:
http://opencv.jp/opencv-1.0.0/document/opencvref_cv_matching.html

サンプルソース:
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;
}

--

以上,参考になりましたら幸いです.
お礼コメント
westernedlocked

お礼率 23% (23/96)

回答ありがとうございます!
表示はできました! 
が、DIBやDDB、デバイスコンテキストやメモリデバイスコンテキストなど・・ わからないことだらけです(汗
変数もhbitmaoやbitmapの違いもわかりませんし、色々勉強しなければならないようです。
ありがとうございました。
投稿日時 - 2011-10-08 23:00:08
関連するQ&A
-PR-
-PR-
このQ&Aで解決しましたか?
関連するQ&A
-PR-
-PR-
こんな書き方もあるよ!この情報は知ってる?あなたの知識を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


新大学生・新社会人のパソコンの悩みを解決!

いま みんなが気になるQ&A

関連するQ&A

-PR-

ピックアップ

-PR-
ページ先頭へ