openCVのテンプレートマッチング(cvMatchTemplate関数)のアルゴリズムについて質問があります。
相関係数マッチング手法(第4引数:CV_TM_CCOEFF_NORMED)を、openCVを使った場合と自分で実装したものを比べたところ、断然openCVの方が速く計算できました。

openCVではどのような高速化手法を利用しているのでしょうか?

どなたかわかる方がいましたら教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

ソース公開されてますから、眺めてみては?

    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q添付画像のファイルはどんな状態のファイルなのでしょうか?クリってもエラ

添付画像のファイルはどんな状態のファイルなのでしょうか?クリってもエラーしか出た事がないのですが

Aベストアンサー

他の回答者様の記入通り、拡張子が無い事には判断出来ません。
また、クリックしてもエラーとありますが、webから探すとか出ませんか?
憶測ですが、多分質問者様のPCにこのファイルを開くアプリケーションが
インストールされていないのではないかな?って思います。
参考までに
よくありがちなのは、XPで作ったエクセルファイル等(逆だったかな^^;)を
ビスタのPCで見ると似たようなアイコンになります。
オフィスの互換パックをインストールすると見れます。

QOpenCVでのテンプレートマッチングについて

質問させてください。
現在画像処理ライブラリのOpenCVを使ってテンプレートマッチングを用いた物体追跡しようと考えています。
今回作ってみたのですがどうしても、
「Bad argument(Array should be CvMat or IplImage)in function cvGetSize」
というエラーが出てしまいます。
おそらく画像の読み込みの部分だとは思うのですが・・・・
よろしくお願いします。

ソースプログラムは次のようになってます。
int main( void ) {

int device1 = 0;
int key=0;

double max_interlinkage=0;
double min_interlinkage=0;

CvPoint max_point;
CvPoint min_point;
CvPoint corner_point;

char windowNameTemplate[] = "Template";//テンプレート画像を表示するウィンドウの名前
char windowNameDestination[] = "Destination";//マッチング結果を表示するウィンドウの名前

//videoInputオブジェクト
videoInput VI;

//利用可能なキャプチャデバイス数を取得
int numDevices = VI.listDevices();

//キャプチャデバイスが見つからなかったら終了
if(numDevices == 0)
{
cerr << "[Error] Capture device not found!!" << endl;
exit(-1);
}

//デバイス初期化(今回はデバイスID = 0,CAPTURE_WIDTH x CAPTURE_HEIGHTでキャプチャ)
VI.setupDevice(device1, CAPTURE_WIDTH, CAPTURE_HEIGHT);

IplImage *templateImage = cvLoadImage( "C:/Documents and Settings/ito/My Document/My Pictures/temp.jpg", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );
IplImage *tempGray = cvCreateImage( cvGetSize(templateImage), IPL_DEPTH_8U, 1 );

if ( templateImage == NULL ) {
//画像が見つからなかった場合
printf( "画像が見つかりません\n" );
return -1;
}

cvCvtColor(templateImage,tempGray,CV_BGR2GRAY);

IplImage *frameImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 3 );//画像用IplImage
IplImage *grayImage = cvCreateImage( cvSize(CAPTURE_WIDTH, CAPTURE_HEIGHT), IPL_DEPTH_8U, 1 );//元画像をグレースケール化した画像用IplImage
IplImage *dstImage = cvCreateImage( cvSize( frameImage->width - templateImage->width + 1, frameImage->height - templateImage->height + 1 ), IPL_DEPTH_32F, 1 );//相違度マップ画像用IplImage

memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize);

cvCvtColor(templateImage,tempGray,CV_BGR2GRAY);

//ループ開始
while(1){

//カメラ・デバイスから画像取得
memcpy(frameImage->imageData, VI.getPixels(device1, false , true), frameImage->imageSize);

cvCvtColor(frameImage,grayImage,CV_BGR2GRAY);

//テンプレートマッチングを行う
cvMatchTemplate( grayImage, tempGray, dstImage, CV_TM_CCOEFF_NORMED );

//テンプレートが元画像のどの部分にあるのかという情報を得る
cvMinMaxLoc( dstImage, &min_interlinkage, &max_interlinkage, &min_point, &max_point, NULL );

if(max_interlinkage>0.75){

corner_point=cvPoint(max_point.x+templateImage->width , max_point.y+templateImage->height);

printf("point x=%d ",max_point.x+templateImage->width);
printf("point y=%d ",max_point.y+templateImage->height);

cvRectangle(frameImage , max_point , corner_point , CV_RGB(255,0,0) , LINE_THICKNESS , LINE_TYPE , SHIFT);

printf("\n");

}else{

printf("point Lost\n");

}

//ウィンドウを生成する
cvNamedWindow( windowNameTemplate, CV_WINDOW_AUTOSIZE );
cvNamedWindow( windowNameDestination, CV_WINDOW_AUTOSIZE );

//画像を表示する
cvShowImage( windowNameTemplate, templateImage );
cvShowImage( windowNameDestination , frameImage );

//キー入力
key = cvWaitKey(1);

if(key=='q'){

break;

}else if(key=='c'){

cvSaveImage("image/frame.bmp",frameImage);

}
}

質問させてください。
現在画像処理ライブラリのOpenCVを使ってテンプレートマッチングを用いた物体追跡しようと考えています。
今回作ってみたのですがどうしても、
「Bad argument(Array should be CvMat or IplImage)in function cvGetSize」
というエラーが出てしまいます。
おそらく画像の読み込みの部分だとは思うのですが・・・・
よろしくお願いします。

ソースプログラムは次のようになってます。
int main( void ) {

int device1 = 0;
int key=0;

double max_interlinkage=0;
dou...続きを読む

Aベストアンサー

 こんばんは。

 ファイルのロードに失敗しているのではないでしょうか。パスをもう一度確認してみましょう。
 手っ取り早く、配下のフォルダに入れてtemp.jpgのファイル名だけでロード出来る様にして置いた方が、無難かもしれません。

 原因は、
 ロードに失敗
 ↓
 templateImage=NULL
 ↓
 cvGetSize(templateImage)に渡される
 ↓
 「Bad argument(Array should be CvMat or IplImage)in function cvGetSize」
 です。

Q右クリで画像保存が出ない!

画像を取りたくて矢印を画像に置くと!手のマークに代わり!右クリができなくなりました。
どうしたらよいのでしょうか?

Aベストアンサー

最近のサイトでは著作権の問題もあり、勝手に保存ができないように右クリックができないように設定しいるところが多くなっているであります。法律に抵触する場合もあるであります。

方法としては、色々あるでありますが、ただ見えてる画像が欲しいのであれば、プリントスクリーンでPC画面全体をコピーして、ペイントソフトにペースト、余分な部分を削除して保存すればいいと思うであります。

プリントスクリーンはググってほしいであります。

Qテンプレートマッチングの座標を表示する方法を教えて

OpenCVでテンプレートマッチング(http://opencv.jp/sample/matching.html)するには、
 (1)cvMatchTemplate (src_img, tmp_img, dst_img, CV_TM_CCOEFF_NORMED);
 (2) cvMinMaxLoc (dst_img, &min_val, &max_val, &min_loc, &max_loc, NULL);
の2種類を用いていますが、
マッチング部分の座標を取得して、表示するにはどうすればよいのでしょうか?

ご存知なら、どうか教えていただけないでしょうか。

Aベストアンサー

座標については、その下の解説にちゃんと書いてますよね?
> 画像中の値の最大,最小値,およびその位置は,関数cvMinMaxLoc()によって取り出す.
> CV_TM_CCOEFF_NORMEDを指定した場合には,最大値の座標がマッチング位置になる.
> また,CV_TM_SQDIFF(SSDとも呼ばれる),CV_TM_SQDIFF_NORMEDを指定した場 合には,最小値の座標がマッチング位置になる.

くわしくはcvMinMaxLocのマニュアルも参照。

表示はどんな方法使いたいか、わからないことには。

Q 友近さんの画像を探しています。本当にいい人で、美人で、セクシーだと思

 友近さんの画像を探しています。本当にいい人で、美人で、セクシーだと思います。着衣・水着・スカート、なんでもOKです(あまり小さいサイズじゃない方がよいです)。どうぞよろしくお願いします。

Aベストアンサー

こちらに数点ありました。
http://bsearch.goo.ne.jp/image.php?UI=web&TAB=web&STYPE=0&CC=1&SCRDEF=0&IMGST=0&IMGSZ=0&IMGC=3&IMGFT=0&IMGFT=1&IMGFT=2&IMGFT=3&MOVPT=0&MOVFT=0&MOVFT=1&MOVFT=2&MOVFT=3&AUDPT=0&NSDP=1&KWDP=1&DC=20&FR=1&SM=mc&OCR=1&SITE=&SITE2=&SITE3=&SITE4=&SITE5=&SITEH=&AUDST=0&AUDMST=0&MOVTHN=0&QGR=1&MOVSC=0&NOJSB=0&QGA=1&NOJS=0&AUDSITE=0&MT=%CD%A7%B6%E1&button=%B2%E8%C1%FC%B8%A1%BA%F7
画像を使用される場合は自己責任でお願いします。

QOpenCV1.1、OpenCV2.3の使い方

これまでOpenCV1.1を使っていたのですが類似画像検索をするのにHOG特徴量を用いたいと思い、HOG特徴量を求める関数のあるOpenCV2.3もインストールしました。

その際、OpenCV1.1はアンインストールして、最初からプログラムを書き換えないとダメなのでしょうか?ためしに今まで書いていたプログラムにOpenCV2.3のライブラリをインクルードしてみると、それだけで100個以上のビルドエラーが発生してしまいました。CとC++の違いによるものなのでしょうか?
あとPathの設定などもOpenCV1.1のときのものを残したまま、OpenCV2.3用のPathを追加しただけなのですが、大丈夫なのでしょうか?

解決方法がわかる方がいらっしゃれば、教えて下さい。よろしくお願いいたします。

Aベストアンサー

まず、OpenCVを使うのに最低限必要なヘッダファイルは cxcore (opencv2 なら core)です。cv ではありませんのでお間違いなきよう。

複数のOpenCVのバージョンを使用するのは不可能ではないかもしれませんが、やめたほうが無難です。少なくとも、ビルドエラーの意味もわからないようでは設定の変更もままなりませんので、新しい方に統一したほうがいいでしょう。ソースの修正もさほど難解ではないはずです。

Q●「美人アプリ」の画像を保存したい!

●「美人アプリ」というアプリを使用しています。

●ここで表示される画像を保存したいのですが、方法がわかりません。可能かどうかも。。

●もし、方法をご存知の方がいらっしゃいましたら教えていただけませんか?おねがいします。

Aベストアンサー

保存したい画像を表示させて、↓の方法で画面をキャプチャすると、写真アルバムから見れます。
http://blog.livedoor.jp/sakusakupocky/archives/50263981.html

Qテンプレートクラス内のテンプレートクラス(インナークラス)のメソッドを実装ファイルで定義したい

現在、ヘッダファイル内で下記のようなクラスを宣言・定義しています。

// test.h
template < typename T1 >
struct A
{
  template < typename T2 >
struct B
  {
    B( A const& arg ) { ... }
  };
};

テンプレートクラスが入れ子になっていて、Bのコンストラクタが引数としてAを取っています。
しかし現状ではコンパイルがとんでもなく遅くなってしまうので、
Bのコンストラクタは宣言のみとし、別途実装ファイル(test.cpp)に定義を書きたいと思っています。

ところがメソッドのシグネチャをどう書けばよいのか分からなくなってしまいました。

苦し紛れに

// test.cpp
template < typename T1, typename T2 >
A<T1>::B<T2>::B( A<T1> const& arg ) { ... }

などと書いてみましたが、違うようです。
解決方法はありますでしょうか?

環境はVC7.1かVC8でコンパイルできればよいです。
よろしくお願いいたします。

現在、ヘッダファイル内で下記のようなクラスを宣言・定義しています。

// test.h
template < typename T1 >
struct A
{
  template < typename T2 >
struct B
  {
    B( A const& arg ) { ... }
  };
};

テンプレートクラスが入れ子になっていて、Bのコンストラクタが引数としてAを取っています。
しかし現状ではコンパイルがとんでもなく遅くなってしまうので、
Bのコンストラクタは宣言のみとし、別途実装ファイル(test.cpp)に定義を書きたいと思っています。

ところが...続きを読む

Aベストアンサー

template < typename T1 >
struct A {
 template < typename T2 >
 struct B {
  B( A const& arg );
 };
};

template<typename T1>
template<typename T2>
A<T1>::B<T2>::B( A<T1> const& arg ) { }

int main() {
 A<int> a;
 A<int>::B<char> c(a);
}

Q右クリ禁止のサイトの画像を保存

質問の通りなのですが右クリック禁止のサイトの画像を保存できるようにする方法はないでしょうか?あと、よく海外でおもしろ動画とかを見せてるサイトがありますが、そういった動画を保存する方法はありますか?重ねて質問すいません^^;

Aベストアンサー

そのサイトを見ないとなんとも言えませんが、
JAVAをオフにしてみると右クリック禁止がはずれる事もあります。

それで駄目ならば、プリントスクリーンを取って画像を修正してください。
まぁ画像を持ち出されたくないサイトならばあまり持ち出さないほうがよろしいかと思います。

ちなみに動画を保存する場合は専用のソフトなどが必要。

QOpenCVによる4値化について

OpenCVを使って画像を4値化したいのですが、アルゴリズムはわかっているのですがどうプログラムを組めばいいのかわかりません。

アルゴリズムはまず濃度ヒストグラムを作って
(1)適当な閾値を3つ(t1,t2,t3),決める。
(2)4つの領域で平均濃度を計算し、それらをa1,a2,a3,a4とする。(4つの領域ってどこ?
(3)新閾値t1,t2,t3とt1=(a1+a2)/2,t2=(a2+a3)/2,t3=(a3+a4)/2として計算する。
(4)Σ(j=1,3) |tj-tj|<εならば停止。そうでなければ(2)に戻る。

なのですが、教えて下さい。

Aベストアンサー

 こんにちは。

 数学としてのN値化は分からないのですが、画像処理としてのN値化でお話しすると、

 (1)RGB[0-255, 0-255, 0-255]の画素をY[0-255]のグレースケールに変換
 (2)Y[0-255]に対して、[N-1]個の閾値を境界線として0~[N-1]を出力する

 が多いように思います。

 (2)は、例えば2値化の場合、1個の閾値を境界線にして、画像フォーマットが1ビットであれば、0~1を出力します。24ビットカラーなどであれば、RGB(0,0,0)又はRGB(255,255,255)を出力します。
 此れを4値化で考えると、3個の閾値で0~3を出力しますが、フォーマットが1ビットでは入りきらない為、4ビット以上の画像フォーマットにセーブすると言う事です(大抵24ビットを使用する)。

 0→RGB(0,0,0)
 1→RGB(85,85,85)
 2→RGB(170,170,170)
 3→RGB(255,255,255)

 アラも在るのですが、以下参考になれば。

//配列の個数を数える
#define ArrayCount(a) (sizeof(a)/sizeof(a[0]))

//グレースケール変換[0-255]を出力する
int RGBToY(int R, int G, int B)
{
return ((54 * R) + (183 * G) + (18 * B)) >> 8;
}

//閾値と比較して[0~count]を決定する
int GetLevel(int color, const int array[], int count)
{
for(int i = 0; i < count; ++i)
if(color < array[i])
break;

return i;
}

//テスト
void test()
{
//IPLに読み込む(24ビットカラー)
IplImage* img = ::cvLoadImage("testimage.bmp", CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);

//閾値の配列
const int thresholds[] = {64, 128, 192};

//閾値の数
const int count = ArrayCount(thresholds);

//count x band = 255にする為
const int band = 255 / count;

for(int y = 0; y < img->height; y++)
{
for(int x = 0; x < img->width; x++)
{
const int pos = (y * img->widthStep) + (x * img->nChannels);
const int R = (unsigned char)img->imageData[pos];
const int G = (unsigned char)img->imageData[pos + 1];
const int B = (unsigned char)img->imageData[pos + 2];
const int Y = ::RGBToY(R, G, B);

const int result = ::GetLevel(Y, thresholds, count) * band;

for(int i = 0; i < img->nChannels; ++i)
img->imageData[pos + i] = result;
}
}

//4値化した結果を24ビットカラーでセーブする
::cvSaveImage("yontika.bmp", img);

//IPLの解放
::cvReleaseImage(&img);
}

 こんにちは。

 数学としてのN値化は分からないのですが、画像処理としてのN値化でお話しすると、

 (1)RGB[0-255, 0-255, 0-255]の画素をY[0-255]のグレースケールに変換
 (2)Y[0-255]に対して、[N-1]個の閾値を境界線として0~[N-1]を出力する

 が多いように思います。

 (2)は、例えば2値化の場合、1個の閾値を境界線にして、画像フォーマットが1ビットであれば、0~1を出力します。24ビットカラーなどであれば、RGB(0,0,0)又はRGB(255,255,255)を出力します。
 此れを4値化で考えると、3個...続きを読む


人気Q&Aランキング

おすすめ情報