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

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

kirinomaの回答

  • ベストアンサー
  • 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

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

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

  • OPENCVの画像処理について

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

  • 画像の比較について

    書き込み失礼します。 プログラム初心者です。 現在、私は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 ヒストグラム比較について 画像の色を比較するためにヒストグラムを比較する関数cvCompareHistを使って比較しています。 ですが↓の画像の図形でRGB成分を分けてからそれぞれを比較したのですが、必ずどの成分も一致とでます。 ヒストグラムは色の分布を持っていてその分布を比較しているんですよね? cvCompareHistがいまいちなにを比較しているのかがはっきりとわからない状態です。

  • OpenCV処理画像をpictureBoxへ。

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

  • 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で処理する方法を教えてください

    カメラの画像をグラフインというメーカーの画像ボードを介してPCに取り込んでいます。 ここでその画像をOpenCVを使用して処理しようとしています。 一度保存した画像を処理するのはできるのですが、 画像ボードのバッファからデータを読み込んできてきて処理する方法が分からず困ってます。 Iplimageという構造体にデータを入れればよさそうなのですが、 その変換のやり方がわかりません。 開発環境はWindowsXP visual C++ 2005 MFC です。 当方、プログラムを始めたばかりなので できれば詳しく教えて頂けると助かります。 よろしくお願いいたします。

  • 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; } ----------------------------------------------------------------

  • opencvについて

    OpenCVの初歩のプログラムなんですが実行するとコマンドプロンプトと実行画面が出てきます。しかし実行画面には何も映りません。エラーも出ず、正しくビルドされています。使用しているwebカメラはMicrosoft社の「LifeCam VX-1000」です。初期設定も正しく設定しました。参考にしているものは、「OpenCV プログラミングブック 第2版」です。どなたかアドバイスお願いします。 プログラム↓ #include <stdio.h> #include <highgui.h> int main(int argc, char** argv) { CvCapture *capture; IplImage *frameImage; char windowNameCapture[] = "Capture"; capture = cvCreateCameraCapture(0); cvNamedWindow(windowNameCapture, CV_WINDOW_AUTOSIZE); while (1) { frameImage = cvQueryFrame(capture); cvShowImage(windowNameCapture, frameImage); if (cvWaitKey(33) == 'q') break; } cvReleaseCapture(&capture); cvDestroyWindow(windowNameCapture); return 0; }

  • Javaでの画像比較方法

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

    • ベストアンサー
    • Java