前回 『複数の画像をつなげる』ことを試みている途中で変節して『画面の一部を切り取る』方向に進んだ と書きました。そこではsubmatを使いました。
そこで2つの入力画像をsrc1,src2とし、
あらかじめ結合した画像を格納するMat combined_matを
int total_cols = src1.cols() + src2.cols();
int max_rows = Math.max(src1.rows(), src2.rows());
Mat Mat combined_mat = new Mat(max_rows, total_cols, src1.type());
のように 準備して
入力画像src1を src1.copyTo(combined_mat.submat(0,src1.rows(),0,src1.cols());
で結合先にコピーしてcombined_matを表示することを試しました。
コンパイルエラーもなく 実行時もエラーなく実行できるのですが 何も表示されません。
Webをググルと ここに同じような現象に悩んでいる記述があり 未解決になっていました。そこの記述は画像の一部をグレースケール化しもと画像に戻すとの話ですが、今回私がやっている内容と同件だと思います。
早々にsubmatというかOpenCvを使うことをあきらめ Bitmap経由で画像をつなげることにしました。
実行結果 |
コーディングは こんな感じ
//結合後のwidth height を求め結合結果を格納するMatおよびサブ画像を準備する int total_width = src1.getWidth() + src2.getWidth(); int max_height = Math.max(src1.getHeight(), src2.getHeight()); Bitmap dst = Bitmap.createBitmap(total_width, max_height, Bitmap.Config.ARGB_8888); Canvas offScreen = new Canvas(dst); //縦方向のオフセットを求める int offset1 = (max_height - src1.getHeight()) / 2; int offset2 = (max_height - src2.getHeight()) / 2; offScreen.drawBitmap(src1, (float)0, (float)offset1, (Paint)null); offScreen.drawBitmap(src2, (float)(src1.getWidth()), (float)offset2, (Paint)null);
src1(上段),src2(中段),dst(下段)を表示すると
OpenCvで結合が実現できず 若干不満が残る結果になりました。submatって画像の一部を切り取って使うことしか利用できないのでしょうか?
OpenCv は使っていません |