OpenCvの使用をあきらめかけた Matを経由してJpegを表示する処理の実験です。
ここに書いたように 『BMPに読み込み』 『BMPをOpenCvのMatに変換』 そのまま 『MatからBMPに再変換』 して表示する。という簡単なプログラムです。まず一旦Matにすることで OpenCvの各種機能を利用できると考えたからです。
その1 アイコンic_launcherを表示する
public class OpenCVnyumonActivity extends Activity { ImageView imgv; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); setContentView(R.layout.main); Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); <---(1) Mat mat = android.BitmapToMat(src); Bitmap dsc= Bitmap.createBitmap(mat.width(), mat.height(), Bitmap.Config.ARGB_8888); <---(2) android.MatToBitmap(mat, dsc); // 処理をした画像を表示する imgv = (ImageView)findViewById(R.id.imageView1); imgv.setImageBitmap(dsc); } }
実行結果 思い通り例の見慣れたアイコンが表示された。
その2 もっと大きなJpegを表示する。
以前Docomoの携帯で撮影した写真を Drawableフォルダに格納して
(1)を Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.suzuran);
として実行。
『予期せず停止しました』と見慣れたエラーメッセージ(苦笑)
自分的には 明らかに予期したエラー なぜならば この現象のため OpenCvの使用をあきらめかけたのだから・・・
今回は ここであきらめるわけには 行かない。
このエラー (2)でMatのサイズを求めているが Matのサイズが ゼロになっていることに原因がある。 どうも 自分が撮影したデータは 画像タイプに問題がありそのため BMP —> Mat 変換がうまくいってなさそうだ。例のBitmap.Config !!!
そこで一旦 Bitmap.Config.ARGB_8888でBMPをcreateし copyすることに。
(2)を次のように変更
Bitmap src = BitmapFactory.decodeResource(getResources(), R.drawable.suzuran);
Bitmap src2 = src.copy(Bitmap.Config.ARGB_8888, true);
Mat mat = android.BitmapToMat(src2);
実行結果 はじめて Mat経由でJpegの表示ができた
その3 画像をリソースから取得するのでなく SDカードから読み込むパターンのテスト
(1)部分を次のように変更
String path=Environment.getExternalStorageDirectory()+”/DCIM/100ANDRO/suzuran.jpg”;
Bitmap src = BitmapFactory.decodeFile(path);
これでも当然うまくいく。
by Android2.2 with OpenCv 2.3.1 for Android |