画面の一部を切り抜く

実はこのテーマの前に 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
スポンサーリンク
Rectangle大広告
Rectangle大広告

シェアする

  • このエントリーをはてなブックマークに追加

フォローする