

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で質問しましょう!
似たような質問が見つかりました
- その他(Microsoft Office) エクセルのマクロについて教えてください。 5 2023/01/21 09:39
- その他(Microsoft Office) ワードのマクロについて教えてください。 1 2023/01/21 16:01
- Chrome(クローム) ノートPCのデスクトップ画面全体にアイコンが 現れず、画面の右1/3位が背景の壁紙のままです 5 2022/09/20 17:44
- Excel(エクセル) EXCELマクロでandroidタブレットから取りんだJPEGファイルをうまくセルに貼り付けられない 2 2022/07/31 15:03
- その他(ソフトウェア) コマンドプロンプトについて教えてください。 状況: 画像編集ソフト上でネットから保存した画像を使うの 3 2022/05/26 11:14
- Windows 10 フォルダ内の全ての画像を矢印キーでスライドできるようにしたい 1 2022/10/21 12:53
- PDF 画像調整してスクショし保存した画像をPC画面と同画質で印刷する方法 1 2022/03/31 19:09
- その他(IT・Webサービス) 画像調整してスクショし保存した画像をPC画面と同画質で印刷する方法 3 2022/03/31 19:11
- PDF 画像調整してスクショし保存した画像を印刷する方法 1 2022/03/31 18:42
- 日用品・生活雑貨 用紙や画用紙のサイズ(A4.四つ切りetc) A4.B4.B5.四つ切り.八つ切り…のサイズを把握し 2 2022/12/29 23:05
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
継承されたABのクラスのポイン...
-
templete における typedef
-
VC++で
-
listをvectorにコピーするときに
-
アンワインド セマンティクス
-
プログラミング言語Cとプログラ...
-
c++で日本語を処理したい
-
Visial C++おけるπの使い方
-
違い
-
C++でのeの近似値の求め方
-
makefileでコンパイルしたい
-
VC++2010での漢字の引数の取り...
-
Linux Ubuntu19.10でQt5.14.1の...
-
enumの値から定義名を文字列化...
-
空白を含む名前のファイル等を
-
C++で日本語の処理がしたいです
-
このプログラミング誰か教えて...
-
C++型変換について
-
もし~ならば~。
-
構造体の各メンバにfor文からア...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
なぜ、C++の標準ヘッダをインク...
-
switch文のエラーについて
-
VC++で文字列から任意の文字を...
-
構文エラーが出ているのですが...
-
gccでコンパイル時のエラー
-
空ENTERの判別
-
vectorのイテレータを大小比較...
-
JPEGやPNGが読めるLoadImage関数
-
C++で、テキストファイルを一行...
-
std::wstringのメモリリークに...
-
enumの値から定義名を文字列化...
-
CStringとString
-
#define中の#のエスケープ
-
std::map の const 修飾について
-
#include "fstream.h"
-
_tcscat がうまくいきません(V...
-
C言語のポインターで詰まっている
-
構造体配列のvectorへの変換と...
-
C++での <iostream.h>と<iostre...
-
ヘッダーファイルがインクルー...
おすすめ情報