プロが教える店舗&オフィスのセキュリティ対策術

テンプレートマッチングというプログラムをやってますが、テンプレート画像にボックスカウンティング処理を行い、フラクタル次元を求めようという進み方で行こうと思って、プログラムを作ってみました。でもコンパイルするとエラーが出てきちゃいました。



int main(int argc, char* argv[])
{
int x,y;
int r,g,b;
int wh=0,BC2=0,BC3=0,BC4=0,BC5=0,BC6=0;
float p;

char* filename = argc == 2 ? argv[1] : (char*) "apple.bmp";
if((src = cvLoadImage(filename,1)) == 0)
return -1;

IplImage *grayimg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1);
IplImage *edgeimg = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1);
IplImage *img = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,3);
IplImage *his = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U,1);

cvCvtColor(src,grayimg,CV_BGR2GRAY);
cvEqualizeHist(grayimg,his);
cvCanny (his,edgeimg,50,200,3);
cvCvtColor (edgeimg,img,CV_GRAY2BGR);


for(y=0;y< img->height;y++){
for(x=0;x< img->width ;x++){
getpixel(img,x,y,&r,&g,&b);
if(r == white){
wh++;
}
}
}

p = (wh*100)/ (img->height * img->width);
printf("height = %d width = %d\n",img->height,img->width);
printf("white pixel = %d(%3.2f %%)\n",wh, p);

(ここで x,y=1 x,y=2 x,y=4 x,y=5 と x,y=6 ももちろん入れてます)

printf("log10(%d)/log10(2)=%1.4f\n",BC2,(log10(BC2)/log10 (2)));
printf("log10(%d)/log10(3)=%1.4f\n",BC3,(log10(BC3)/log10 (3)));
(ここでlog10(6)までの続きがあります)

printf("((log10(%d)-log10(%d))/(log10(2)-log10(3)))=%1.4f\n",BC2,BC3,(log10(BC2)-log10(BC3))/(log10(2)-log10(3)));
(ここでlog10(6)までの続きがあります)

double fd,fd23,fd34,fd24,fd25,fd35,fd45,fd26,fd36,fd46,fd56;

fd23 = -(log10(BC2)-log10(BC3))/(log10(2)-log10(3));
(ここでlog10(6)までの続きがあります)

fd = ((fd23+fd34+fd24+fd25+fd35+fd45+fd26+fd36+fd46+fd56)/10);
printf("フラクタル次元は%1.4fです\n",fd);



ここからはopenCVの関数が使ってます。



プログラムはこのようなんですが、コンパイルするとこのエラーが出てきました。

jikken2.cpp(528) : error C2668: 'log10' : ambiguous call to overloaded function
c:\program files\microsoft visual studio 8\vc\include\math.h(569): could be 'long double log10(long double)'
c:\program files\microsoft visual studio 8\vc\include\math.h(521): or 'float log10(float)'
c:\program files\microsoft visual studio 8\vc\include\math.h(122): or 'double log10(double)'
while trying to match the argument list '(int)'

誰かお分かりになる方々をぜひぜひお願いします。

A 回答 (2件)

これは、ソースコードを見る限りC++じゃなくてC言語のソースコードですね。

C++のオーバーロードのエラーメッセージが分からないの文法理解レベルでは、素直にC言語オプションでコンパイルしたほうが良いと思います。

それとエラーの原因であるデータ型の適当さは今のうちに直しましょう。パラメータを暗黙のデータ型変換にまかせたりせず、ちゃんと型を合わせて関数を使うクセをつけた方が良いですよ。思わぬバグで後で苦労すると思います(無闇にキャストでごまかさないように)。
    • good
    • 0

log10に限らず、<cmath>で宣言される関数の大部分は、float、double、long doubleについて多重定義されています。

また、<complex>をインクルードすれば、そのうちの多くの関数がcomplexクラステンプレートについても多重定義されます。
そのため、int型の実引数を渡した場合には、多重定義がうまく解決できなくてエラーが発生します。

> jikken2.cpp(528) : error C2668: 'log10' : ambiguous call to overloaded function

このエラーメッセージが、そのものズバリの指摘をしています。
もし英語が読めないのなら、無理をせず、日本語版を使うことをお勧めします。
    • good
    • 0

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