前提・実現したいこと
C言語とGCCを使っています。
ZNCC(テンプレートマッチング)を使い類似度の一番高い一番最初の画素の特定を輝度情報をもとに実装したいのですが、コンパイルは通るものの探索がある一定の位置でプログラムが強制終了してしまいます。
画像のピクセルの位置は一次元の配列になっています。
imgは元の大きい画像をtempはテンプレート画像を表しています。
NCC関数内で元画像の(x,y)を起点とする類似度を求め、templatematching関数で類似度が一番高かった座標を求めています。
私はプログラミング初心者でつたないコードしか書けませんがよろしくお願いいたします。
ZNCCの実装にあたって参考にしたサイトです
テンプレートマッチングについて理解する
パターンマッチング(正規化相関など)
該当のソースコード
C言語
1typedef struct{ 2 unsigned int width; 3 unsigned int height; 4 Rgb *rgb; 5 Hsv *hsv; 6}Image; 7 8int templatematching(Image *img, Image *temp) 9{ 10 int i, j, k, x, y, index; 11 double ncc=-1.0, n, mu=0; 12 13 for(k=0; k<temp->height*temp->width; k++){ 14 mu += temp->hsv[k].v; 15 } 16 mu = mu / k; 17 18 for(i=0; i<img->height; i++){ 19 for(j=0; j<img->width; j++){ 20 21 if(ncc < (n = NCC(img, temp, j, i, mu))) 22 { 23 ncc = n; 24 y = i; 25 x = j; 26 } 27 } 28 } 29 30 index = y*img->width + x; 31 return index; 32 33} 34 35 36double NCC(Image *img, Image *temp, int x, int y, double mu) 37{ 38 int i, j, k=0, index; 39 double bunsi=0, bunbo1=0, bunbo2=0; 40 double ncc, mi=0; 41 42 index = y * img->width + x; 43 44 45 for(i=0; i<temp->height-1; i++){ 46 for(j=0; j<temp->width-1; j++){ 47 48 mi += (img->hsv[index + i * img->width + j].v); 49 k++; 50 } 51 } 52 53 mi = mi / k; 54 55 56 for(i=0; i<temp->height-1; i++){ 57 for(j=0; j<temp->width-1; j++){ 58 if((y + i * img->width > img->height) || (x + j > img->width) ) break; 59 bunsi += (img->hsv[index + i * img->width + j].v-mi) * (temp->hsv[i*temp->width+j].v-mu); 60 bunbo1 += sqrt((img->hsv[index + i * img->width + j].v -mi)* (img->hsv[index + i * img->width + j].v -mi)); 61 bunbo2 += sqrt((temp->hsv[i*temp->width+j].v- mu) * (temp->hsv[i*temp->width+j].v- mu)); 62 63 } 64 } 65 66 ncc = bunsi / (bunbo1 * bunbo2); 67 68 return ncc; 69} 70
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/02/04 09:14
退会済みユーザー
2020/02/04 09:44 編集