• ベストアンサー
  • 困ってます

opencvを使って画像比較

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

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数4503
  • ありがとう数2

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

  • ベストアンサー
  • 回答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; } -- 以上,参考になりましたら幸いです.

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • c言語 bmp 画像比較

    c言語で画像比較をしたいです。 具体的には、デスクトップの背景の一部分(4×4bitくらい)が、画面上にあれば処理を実行する、みたいにしたいです。 24bitmap画像です。使ってるのはc言語です。 どういうAPIを使えば良いのでしょうか? それかc言語では難しいでしょうか? 回答お願いします。

  • OpenCVを使った画像の切り抜き

    添付画像のように、サイズ(X,Y)の画像があったとします。 その画像のある座標(X',Y')とサイズを指定してできた短形領域を、IplImageとして保存するにはどうすればいいのでしょうか? OpenCVを使ってるのですが、そういった関数はなかったでしょうか? よろしくお願いします。

  • 画像の比較について

    書き込み失礼します。 プログラム初心者です。 現在、私はVC++とOpenCVをつかってテンプレートマッチングなるものを試しています。 その中でマッチング結果(0.0や0.5、1.0など)を見たいと思っているのですが、画像と画像を比較すると0.0から1.0に正規化しているにも関わらず現れる数値は15495939などの値になってしまったりします。 見ようとしている場所が悪いのかプログラムが悪いのか画像が悪いのか(画像はカメラで取得したものを使用)が全くわかりません。 大変申し訳ありませんがご助言に頂けたら幸いです。 いかに私が書いているテンプレートマッチングのプログラムの一部をしめします。 //テンプレートマッチングを行う cvMatchTemplate(sourceBinaryImage,templateBinaryImage,differenceMapImage,CV_TM_SQDIFF); //テンプレートが画像のどの部分にあるのかという情報を得る cvMinMaxLoc(differenceMapImage,&minValue,&maxValue,&minLocation,&maxLocation,NULL); //結果の表示方法の統一 cvNormalize(differenceMapImage,differenceMapImage,1,0,CV_MINMAX); printf("%d\n",&minValue);

  • OPENCVの画像処理について

    現在OPENCVを使って画像処理の勉強をしているのですが画像を読み込む際 IplImage* cvLoadImage という関数?を使って画像を読み込んでいるのですが 例えばファイルAに10枚画像が入っていたとしてその10枚をIplImage* cvLoadImageで一枚ずつ読み込むのではなくまとめて読みこむ(配列のように読みこんだ画像の順から[1]などの番号が付くような)という関数はないのでしょうか? 画像を変えるたびに「名前.jpg」を変えないといけない手間を省きたいです。

  • OpenCv ヒストグラム比較について

    OpenCv ヒストグラム比較について 画像の色を比較するためにヒストグラムを比較する関数cvCompareHistを使って比較しています。 ですが↓の画像の図形でRGB成分を分けてからそれぞれを比較したのですが、必ずどの成分も一致とでます。 ヒストグラムは色の分布を持っていてその分布を比較しているんですよね? cvCompareHistがいまいちなにを比較しているのかがはっきりとわからない状態です。

  • Javaでの画像比較方法

    複数の画像(画面のキャプチャを想定)内に、比較画像が何度含まれるかをカウントしたいです。 (イメージとしては、UWSCというツールの画像認識を画像2枚で行いたいといった感じです) 以前作ったテンプレートマッチングで試したところ、画像1枚(1920×1080)に3分ほどかかってしまいます。 何かいいライブラリ・アルゴリズムがあれば、教えて頂きたく。 また、出来たらライブラリの使い方を簡単にでかまいませんので教えて頂けたら幸いです。

    • ベストアンサー
    • Java
  • opencvのテンプレートマッチングについて

    私は、webカメラを使用し、動画像中の手形をリアルタイムで検出して、その手形に近い指文字を判別して、「あ」の形なら『あ』といった様に順次表示していくといったプログラムを作成しています。 現在、手の部分だけを抽出し、それをhandImageという画像として生成する段階まで来ました。 この後、このhandImageと、あらかじめ用意しておいたテンプレート画像(手の指文字画像)を比較し、handImageに似ている画像を求めるために、テンプレートマッチングを使用したいのですが、うまくいきません。 色々試しましたが、 "Sizes of input arguments do not match (image and template should have the same type)" と出てきたりで動きません。 それぞれの画素を読み込み、輝度値を比較していって似てる画像を探す方法なども考えました。 ザックリとしたソースコードを載せておきます。 IplImage *handImage = cvCreateImage(cvSize(100,100),IPL_DEPTH_8U,1); //手形部分の切り取り画像 IplImage *templateImage; for(int i = 26; i < 26; i++){ //テンプレ画像26枚を読み込む templateImage = cvLoadImage("yubimoji1.bmp") for(int y=0;y<lpt.y-fpt.y;y++){ for(int x=0;x<lpt.x-fpt.x;x++){ if( pix=(uchar)(skinImage->imageData[skinImage->widthStep*(y+fpt.y)+x+fpt.x]); //画素読み込み                   value1 == value2; //それぞれ輝度値を照らし合わせていく                   value ++;                  }                 ・                 ・                 ・            if(value > 100 * 100 * 0.8)                printf("あ\n");             else                printf("い\n"):                 ・                 ・                 ・ とまぁ、全然意味不明状態ですね。。。 どなたか、カメラ上(リアルタイム映像)でのテンプレートマッチングの方法、あるいはザックリとソースコードを書いて頂けたら、とても助かります。。。 よろしくお願いします。 動作環境 Windows 7 OpenCV_1.1pre1a Visual C++ 2008 Express Edition

  • テンプレートマッチングの高速化手法について

    openCVのテンプレートマッチング(cvMatchTemplate関数)のアルゴリズムについて質問があります。 相関係数マッチング手法(第4引数:CV_TM_CCOEFF_NORMED)を、openCVを使った場合と自分で実装したものを比べたところ、断然openCVの方が速く計算できました。 openCVではどのような高速化手法を利用しているのでしょうか? どなたかわかる方がいましたら教えてください。

  • OpenCV処理画像をpictureBoxへ。

    VC++にて画像処理を行っています。 OpenCVのライブラリを使って画像処理をしようと考えているのですが、 処理した画像がMFCで作成したpitureBoxに表示の仕方が分かりません。 調べていくうちに、 「IplImage形式の画像を直接ウィンドウに描画することは出来ないので、 画像をDIBセクション形式に変換してWindows固有の描画処理を行うといい。」 ということが分かり、DIBセクション形式への変換には、IPLを入手し、 「iplConvertToDIB()関数」を使うということが分かりました。 このiplConvertToDIB()関数をつかって画像表示の方法を教えてはいただけないでしょうか?サンプルのソースなどありましたらよろしくお願いいたします。

  • OpenCVで画像を読み込みたい

    OpenCVを勉強しようと思い先日始めました。 http://chihara.naist.jp/opencv/?FrontPage 上記のサイトに掲載されている通りにVC++ 2008 EEで ・環境変数PATH ・インクルードファイル ・ライブラリファイル ・リンカ の設定をしました。 これでいざプログラムをコンパイルして実行すると何故か画像が読み込んでくれません。 これらの設定以外の他にするべきことがあるのでしょうか? いきなり出鼻を挫かれたので困っています。よろしくお願いします。 OS:XP SP2 開発環境:VC++ 2008 EE 実行したプログラム ---------------------------------------------------------------- #include "cv.h" #include "highgui.h" int main( int argc, char** argv ) { IplImage* img; char* filename = "abc.bmp"; if( argc == 2 && (img = cvLoadImage( filename, 1)) != 0 ) { cvNamedWindow( "Image view", 1 ); cvShowImage( "Image view", img ); cvWaitKey(0); // イベント処理を含む場合には,これが重要. cvDestroyWindow( "Image view" ); cvReleaseImage( &img ); return 0; } return -1; } ----------------------------------------------------------------