• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:opencvを使って画像比較)

opencvを使った画像比較方法と関数の概要

このQ&Aのポイント
  • opencvを使用してデスクトップの背景の一部と画面上の画像を比較する方法について説明します。
  • テンプレートマッチングという方法を使用することで、デスクトップの背景と切り取った4×4の画像を比較することができます。
  • また、画面を一瞬で保存してIplImageに保存する関数も使用することができます。

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

  • ベストアンサー
  • kirinoma
  • ベストアンサー率53% (288/542)
回答No.1

こんにちは. テンプレートマッチングには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
質問者

お礼

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

すると、全ての回答が全文表示されます。

関連するQ&A