実はこのテーマの前に OpenCv CookBookの 『複数の画像をつなげる』ことを実験しようと 思ってとりかかりました。しかし そこで扱っている ROI(Region Of Interest)はAndroid版では見つかりません。そのかわりMatクラスに submatというメソッドがありました。Matから指定した部分を抜き出して扱える submatを使って画像を結合しようとしたのですが なかなかうまくいきません。submatを理解するために、まずは画面の一部を切り抜くことにチャレンジしました。
submatメソッドは
Mat submat(int rowStart, int rowEnd, int colStart, int colEnd)
int rowStart : 開始row
int rowEnd : 終了row
int colStart : 開始col
int colEnd : 終了col
row colの開始・終了位置を指定してあるMatの一部を取り出してMatとして扱える優れもののように見えますが これがなかなか・・・
入力画像の縦横をそれぞれ3等分し中央部分を切り出すことを考えました。
失敗したパターン |
submatメソッドはMatが戻り値になることから
int rowStart = image1.rows()/3; int rowEnd = image1.rows() * 2 / 3; int colStart = image1.cols()/3; int colEnd = image1.cols() * 2 / 3; Mat sub = image1.submat(rowStart , rowEnd , colStart , colEnd ); Bitmap bmp1 = Bitmap.createBitmap(sub.width(), sub.height(), Bitmap.Config.ARGB_8888); android.MatToBitmap(sub, bmp1);
として 入力画像と一緒に表示すると(上段:入力画像 下段:切り出したつもりの画像)
あれれ なんともいえない縞模様 元画像のどっかにありそうで絶対無いしろものが・・・・
成功したパターン |
submatの使い方に誤りがあると思い
int rowStart = image1.rows()/3; int rowEnd = image1.rows() * 2 / 3; int colStart = image1.cols()/3; int colEnd = image1.cols() * 2 / 3; Mat sub = new Mat(); image1.submat(rowStart , rowEnd , colStart , colEnd ).copyTo(sub); Bitmap bmp1 = Bitmap.createBitmap(sub.width(), sub.height(), Bitmap.Config.ARGB_8888); android.MatToBitmap(sub, bmp1);
と変えたらうまくいきました。
submatで取り出した仮想的なMatをそのまま使ってはいけないようです。
by Android2.2 with OpenCv 2.3.1 for Android |