• 締切済み

opencvでのヒストグラム比較

opencv初心者です。 画像処理に興味を持ち、opencv を使い画像の比較をしたいと思っています。 http://d.hatena.ne.jp/ninoseki/20090208 上記のページのプログラムを試し、無事結果は出たのですが Correlation、Chi-square、Intersection、Bhattacharyya distance の4つの違いがわかりません。 どなたか詳しい方ご教授お願いしたいします。 ちなみに、作りたいプログラムは異なる2枚の画像を読み込み、どれぐらい似ているのか判断するものです。 よろしくお願いします。

みんなの回答

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1
全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • OpenCVを用いたヒストグラムの比較について

     現在画像の類似度を求めるために、OpenCV1.0を使って色のヒストグラムの距離を求めるということを行っております。OpenCVで公開されているヒストグラム間の距離のサンプルプログラムを使って行っているのですが、結果があまり芳しくないためいろいろ調べなおしたところ、減色処理、量子化というワードにたどり着きました。  しかし調べてみてもいまいち分からず、行き詰っているのが現状です。どなたか減色処理や量子化について詳しい人がおりましたら、是非回答のほうよろしくお願いします。以下がOpenCVのコードなのですが、どこの部分をどのように変えたらそれが実現できるのかも是非回答お願いいたします。 #include <cv.h> #include <highgui.h> #include <math.h> #include <stdio.h> int main (int argc, char **argv) { char text[16]; int i, hist_size = 256, sch = 0; float range_0[] = { 0, 256 }; float *ranges[] = { range_0 }; double tmp, dist = 0; IplImage *src_img1 = 0, *src_img2 = 0, *dst_img1[4] = { 0, 0, 0, 0 }, *dst_img2[4] = { 0, 0, 0, 0}; CvHistogram *hist1, *hist2; CvFont font; CvSize text_size; // (1)二枚の画像を読み込む.チャンネル数が等しくない場合は,終了 if (argc >= 3) { src_img1 = cvLoadImage (argv[1], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); src_img2 = cvLoadImage (argv[2], CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR); } if (src_img1 == 0 || src_img2 == 0) return -1; if (src_img1->nChannels != src_img2->nChannels) return -1; // (2)入力画像のチャンネル数分の画像領域を確保 sch = src_img1->nChannels; for (i = 0; i < sch; i++) { dst_img1[i] = cvCreateImage (cvSize (src_img1->width, src_img1->height), src_img1->depth, 1); dst_img2[i] = cvCreateImage (cvSize (src_img2->width, src_img2->height), src_img2->depth, 1); } // (3)ヒストグラム構造体を確保 hist1 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1); hist2 = cvCreateHist (1, &hist_size, CV_HIST_ARRAY, ranges, 1); // (4)入力画像がマルチチャンネルの場合,画像をチャンネル毎に分割 if (sch == 1) { cvCopy (src_img1, dst_img1[0], NULL); cvCopy (src_img2, dst_img2[0], NULL); } else { cvSplit (src_img1, dst_img1[0], dst_img1[1], dst_img1[2], dst_img1[3]); cvSplit (src_img2, dst_img2[0], dst_img2[1], dst_img2[2], dst_img2[3]); } // (5)ヒストグラムを計算,正規化して,距離を求める for (i = 0; i < sch; i++) { cvCalcHist (&dst_img1[i], hist1, 0, NULL); cvCalcHist (&dst_img2[i], hist2, 0, NULL); cvNormalizeHis

  • OpenCV1.1、OpenCV2.3の使い方

    これまでOpenCV1.1を使っていたのですが類似画像検索をするのにHOG特徴量を用いたいと思い、HOG特徴量を求める関数のあるOpenCV2.3もインストールしました。 その際、OpenCV1.1はアンインストールして、最初からプログラムを書き換えないとダメなのでしょうか?ためしに今まで書いていたプログラムにOpenCV2.3のライブラリをインクルードしてみると、それだけで100個以上のビルドエラーが発生してしまいました。CとC++の違いによるものなのでしょうか? あとPathの設定などもOpenCV1.1のときのものを残したまま、OpenCV2.3用のPathを追加しただけなのですが、大丈夫なのでしょうか? 解決方法がわかる方がいらっしゃれば、教えて下さい。よろしくお願いいたします。

  • opencvによる画像処理。

    opencvによる画像処理。 今opencvを使った画像処理をしているのですが、これって普通のプログラム中に関数みたいな感じで使う事って出来ないのでしょうか? 例えば、Cで車両を制御するプログラムを作ってる場合に、車両が何mm進んだ時点で車両に取り付けたカメラを使って、画像処理を行う。みたいな処理をしたいです。 でもopencvのmain文って、引数が二つあってそれをどう渡せばいいのかよく分かりません。 素人なので分かりずらくて申し訳ありません。

  • opencvを使って画像比較

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

  • opencvを用いて画像を表示したいです(初心者です)

    こんばんは。 opencvを用いて画像処理をしようと思っているのですが、下のページの通りにプロジェクトを作成し、ビルドを行ったのですが、 http://www.saturn.dti.ne.jp/~npaka/robot/opencv/index.html 「cxcore100.dllが見つからなかったため、このアプリケーションを開始できませんでした。」 という表示が出てしまいます。cxcore100.dllは C:\Program Files\OpenCV\bin←この中に見つけたのですが、どうしていいかわかりません。 どなたか、おわかりになる方ご教授願えないでしょうか?

  • OpenCVはCGIで使用できるのでしょうか

    普段、Visual C++でOpenCVを使い、Windowsのネイティブアプリを作る勉強をしています。 しかし今回、web上にてOpenCVの画像処理を用いたプログラムを動かさなければいけなくなりました。 なのですが私はwebに関して全くの素人で、色々調べた所CGIというもので出来そうだと分かりました。 C++とOpenCVを使ってCGIを作り、それをサーバに置くことでネイティブアプリと同じように動かせるのでしょうか? 例えば、クライアントがブラウザから画像をアップロードし、それにCGI(C++とOpenCV)で何らかの画像加工を行って、その結果をブラウザに返して表示するということは出来るのでしょうか。 また、出来るとすれば、クライアント側のPCにOpenCVがインストールされていなくても使えるのでしょうか。 どうぞよろしくお願いします。

  • OpenCVで出力を24bitのbmpにするには?

    OpenCVを使って画像処理(ラべリングなど)をしたのですが、出力を24bitのbmp形式の画像で出力させたいです。 ビット深度?(8bitのbmp形式から24bitのbmp形式)を変更させることはできますか? 自分でいろいろ調べたのですが、いまいち分からなくて困っています。 もしわかる方がいらっしゃれば是非教えてください。 OpenCV2.4.6,VisualC++2010を用いています。 入力画像は白黒画像で、24bitのbmp形式の画像です。 ですが、OpenCVで画像処理させると8bitのbmp画像として出力されます。(ラべリングなどの処理をした後の画像) 他のプログラムで24bitのbmp形式で処理させているため8bitのbmp形式の画像を24bitのbmp画像に変更させたいのですが、変更する方法がわかる方がいればぜひ教えてください。 私自身、プログラムは大学の授業レベル、OpenCVは使い始めて数ヶ月なので詳しくないです。 よろしくお願いします。

  • OpenCV cvmatchtemplate

    OpenCVで画像一致検出のプログラムを組んでいます。 Cvmatchtemplateは動作していますが、そのパラメーター、 CV_TM_SQDIFFはSquared difference 輝度差の二乗和 CV_TM_CCORRはCross correlation 相互相関 CV_TM_CCOEFFはCorrelation coefficient 相関係数 でNORMEDはそれらの正規化したもの と言う所までは判ったのですが、(分かったでは無い-笑-)それらの意味が良く分かりません、かろうじて理解出来るのは輝度差の二乗和のみです。 私としては各々の詳細を理解出来なくても、どの様な結果を導きたい時使うパラメーターかが判れば良いのですが、色々サイトを探しても、数式が書かれている所はありますが具体例が書かれている所が見つかりませんでした。 どなたか良いサイト、もしくは本をご存知無いでしょうか。 よろしくお願いいたします。

  • OpenCvライブラリを使い、C++を用いてウェブカメラを監視カメラみ

    OpenCvライブラリを使い、C++を用いてウェブカメラを監視カメラみたいな役割をさせようとしています。 そこで、1秒ごとに画像をキャプチャし、10秒(10枚)までを指定したフォルダに保存する。 (例)     ファイル名   1秒の画像   file1.bmp 2秒の画像   file2.bmp ・ ・ ・ ・   10秒の画像   file10.bmp と、こんな風に そして、保存していた背景画像と、1~10枚撮った画像を比較していき、違いが出たら、 違いが出た画像だけを別のフォルダに保存するというプログラムを作ろうとしています。 OpenCv,C++初心者なので、うまく伝えられているか分かりませんが、宜しければプログラムを教えてください。

  • openCVの超解像処理 その2

    前回,openCVの超解像処理を質問させてもらったものです. 今, http://opencv.jp/opencv2-x-samples/usage_of_sparsemat_2_superresolution の超解像処理をそのまま実行しています. 前回の質問(http://okwave.jp/qa/q6341130.html)で,1枚の画像を劣化させて複数の画像を作りだして,超解像処理をしていることはわかり,実行できるようになりました. しかし,実際に行いたいのは,自分が持っている複数の画像を使って超解像処理を実行してみたいのですが,その場合プログラムのどの部分をどのように変えたらいいのでしょうか? ヒントだけでもいいので,ご面倒かもしれませんが,ご教授お願いします.

このQ&Aのポイント
  • FAXで受信した文章や図面をPDFに変換して保存する方法を教えてください。
  • また、変換後のPDFをメールの添付ファイルとして送信する方法も知りたいです。
  • 環境はWindows10で、無線LANに接続しています。電話回線はひかり回線です。
回答を見る

専門家に質問してみよう