次の関数を見て欲しい。 以下のプログラムはC言語で書かれた 画像の中のオブジェクトをサーチし、得られた位置の結果を格納するプログラムだ。
typedef struct _SearchParameter { IMAGEHANDLE img; POINT pt1; int *result; } SearchParametervoid Search(SearchParameter* param) { result = Hoge(param->img); }
このプログラムの何が問題かわかるかな?
ん〜SearchParameterに変更があったとき、修正しないといけない箇所が多くなる?
その通り、またユーザーはSearch関数を使うときパラメータの型をいちいち気にしないといけないね。
場合によってはパラメータの構造体を書き換える必要がある。
しかも、どれが、InでどれがOutを役割を果たしているか、SearchParameterの型だけでは判断できないね。
ではGenericで現代的なC++スタイルで書き直すとどうなるだろうか? 参考としてOpenCVのOutputArrayというものがある。 以下はOpenCV のテンプレートマッチングのサンプルプログラムだ。
void MatchingMethod( int, void* ) { Mat img_display; img.copyTo( img_display ); int result_cols = img.cols - templ.cols + 1; int result_rows = img.rows - templ.rows + 1; result.create( result_rows, result_cols, CV_32FC1 ); bool method_accepts_mask = (TM_SQDIFF == match_method || match_method == TM_CCORR_NORMED); if (use_mask && method_accepts_mask) { matchTemplate( img, templ, result, match_method, mask); } else { matchTemplate( img, templ, result, match_method); } normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() ); double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); if( match_method == TM_SQDIFF || match_method == TM_SQDIFF_NORMED ) { matchLoc = minLoc; } else { matchLoc = maxLoc; } rectangle( img_display, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 ); rectangle( result, matchLoc, Point( matchLoc.x + templ.cols , matchLoc.y + templ.rows ), Scalar::all(0), 2, 8, 0 ); imshow( image_window, img_display ); imshow( result_window, result ); return; }
注目する箇所はここ
matchTemplate( img, templ, result, match_method);
さぁこれらの型はなんだと思う?
imgは画像のポインタ、
resultはint型かな?-1がエラーになってるのかな?
InputArrayとOutputArray!?アレ...ジェネリックになってる!
ResultをMatクラスとして受け取り、
受け渡された値をminMaxLocで解釈してるんだ!!
残念ながら、卒業した先輩たちが残した最初のようなクソコードがGitにちらほらあるんだ。
まずは君にこのクソコードをジェネリックなスタイルにしていただきたい。
まぁみんなジェネリックなスタイルを意識しないでオレオレライブラリを作り後は知ったこっちゃねぇって感じだったからね。
ITの派遣社員もそんな感じわ。どの企業もITエンジニアを派遣社員としてしか雇わないから、知らない人が残したスパゲッティコードが累積して、泥沼のようになっている。それが嫌で恐怖でこうしてITを教育する学校の非常勤講師に私は逃げてきたわ。
はぁ...