

opencvを使って画像比較をしたいです。
具体的には、デスクトップの背景の一部分(4×4bitくらい)が、画面上にあれば処理を実行する、みたいにしたいです。(他のウィンドウなどで隠れていたら実行しない)
具体的にどのような関数を使えば作れますか?
テンプレートマッチングという方法でいけそうなのですが、一旦プリントスクリーンキーなどで画面を保存して、それと切り取った4×4の画像を比較していく。のような感じにすればいいのでしょうか?
そのような関数はあるのでしょうか?
それと画面を一瞬で保存して、IplImageに保存する。みたいな関数はありますか?
下手くそな日本語ですが回答よろしくお願いします・・。
No.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;
}
--
以上,参考になりましたら幸いです.
回答ありがとうございます!
表示はできました!
が、DIBやDDB、デバイスコンテキストやメモリデバイスコンテキストなど・・ わからないことだらけです(汗
変数もhbitmaoやbitmapの違いもわかりませんし、色々勉強しなければならないようです。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 MACアドレス
-
【C++】ヘッダ内でstringを格納...
-
C++でUNDOを実装しようとしてい...
-
「Aに対するBの割合」と「Aに対...
-
Aの値からBの値を除するとは??
-
2曲同時再生するにはどうした...
-
ある商品のロス率を5%見込み、...
-
有効数字について 以前質問をし...
-
int16_t の _t は何?
-
fgetsについて
-
マイナスからプラスへ転じた時...
-
三角形の判別
-
プログラムでの数字につく”f”の...
-
std::set<int> で、ある値が何...
-
c言語で、繰り返し文の中で、0....
-
2重定義って??
-
Excel VBAで、Application.Inpu...
-
C言語のwhile文を使った素数判...
-
火災保険の値上げについて
-
#define _CRT_SECURE_NO_WARNIN...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VC++で文字列から任意の文字を...
-
なぜ、C++の標準ヘッダをインク...
-
switch文のエラーについて
-
VxWorks 6.4ソケット接続につい...
-
gccでコンパイル時のエラー
-
iostream インクルード時に発生...
-
#include "fstream.h"
-
【C++】ヘッダ内でstringを格納...
-
#defineの使い方について
-
構文エラーが出ているのですが...
-
C言語のポインターで詰まっている
-
std::map の const 修飾について
-
C++での <iostream.h>と<iostre...
-
enumの値から定義名を文字列化...
-
MingwでC++のソースがコンパイ...
-
違い
-
VC++で
-
C++で日本語の処理がしたいです
-
継承されたABのクラスのポイン...
-
C++でShowCursorを使いたい。
おすすめ情報