cv:add()にprintf()を追加して、cvAdd()を読んだら本当にライブラリのcv:add()を通過しているかを確認するところから作業を開始した。
トレースすればええやんって、聞こえてきそうだけど、OpenCVのソースコードに慣れるという意味で眺めているところもあるので地道な作業で解析を進めていく。
対象ソースコードはmodules/core/src/core.cppである。
printf()を追加して、"make install"すると、律儀にも全てをコンパイルし始めた。
これじゃぁ、ワンパス作るのに時間がかかりそうだなぁ。
まぁ、地道に作っていくことにしよう。
テストコードは次のように書いた。
// g++ ./sample.c -L/usr/local/lib -lopencv_core -lopencv_imgcodecs
void main()
{
IplImage *src1, *src2, *dst;
src1 = cvLoadImage( "src1.bmp", CV_LOAD_IMAGE_UNCHANGED ),
src2 = cvLoadImage( "src2.bmp", CV_LOAD_IMAGE_UNCHANGED ),
dst = cvCloneImage( src ),
cvAdd( src1, src2, dst, 0 ), // dst = src1 + src2
cvSaveImage( "cvadd.bmp", dst, 0 ),
return;
}
2つ目に確認したのがarithm_op()である。
addやsubが呼び出されると、必ず、arithm_op()を通過して、色に合わせた関数を呼んでくるようになっていた。
arithm_op()が少し大きいので念の為、arithm_op()にもprintf()を入れて、どこを通っているか確認してみよう。
テストコードでは、ここからadd8u()が呼び出されるようになっている。
H/Wアクセでは、まず、add8u()内でsrc1、src2、dstの3つのポインタがCMA領域であれば、H/Wアクセするようにする。
追加コードとしては、add8u()内でsrc1、src2、dstのポインタ確認をしなければいけない。
ポインタ確認の関数はalloc.cに置いておきたいんだけど、arith.cがデフォルトでalloc.cを見れるようになっているかも確認しておかなければいけない。
まぁ、いろいろ確認しなきゃ・・・
#確認だけならネイティブ環境でやらなくてもと言われそうだけど、x86環境で確認するとSSE使われたりしちゃうからなぁ。