【问题标题】:How to convert the bitmap image to mat image如何将位图图像转换为mat图像
【发布时间】:2015-02-17 07:26:39
【问题描述】:

我的问题是如何将我进入 onActivityResult 的位图图像转换为 mat 对象,以便我使用本机部分进行一些图像处理。我想对我的 mat 图像进行图像处理。提前致谢

 private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS:
                {
                    //System.loadLibrary("nativegray");
                    Log.i(TAG, "OpenCV loaded successfully");
                    //mOpenCvCameraView.enableView();
                } break;
                default:
                {
                    super.onManagerConnected(status);
                } break;
            }
        }
    };


protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
     setContentView(R.layout.activity_main);
     imgFavorite = (ImageView)findViewById(R.id.imageView1);
     imgMat=new Mat();
     /*imgFavorite.setOnClickListener(new OnClickListener() {
         @Override
         public void onClick(View v) {
            open();
         }
      });*/
}
public void open(){
    Intent intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, 0);
 }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   // TODO Auto-generated method stub
   super.onActivityResult(requestCode, resultCode, data);
   Bitmap bp = (Bitmap) data.getExtras().get("data");

   //my code here
   imgFavorite.setImageBitmap(bp);
}
@Override
public void onResume()
{
    super.onResume();
    OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_9, this, mLoaderCallback);
    imgFavorite.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
           open();
        }
     });
}









@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

【问题讨论】:

标签: android opencv bitmap mat


【解决方案1】:

Mat 是多维数组,位图是二维数组。

您可以使用 copyPixelsToBuffer 从位图中获取原始数据:http://developer.android.com/reference/android/graphics/Bitmap.html#copyPixelsToBuffer(java.nio.Buffer)

然后您可以使用http://developer.android.com/reference/java/nio/ByteBuffer.html#array() 获取字节[]。

希望您应该能够使用它来创建您的 Mat。

【讨论】:

  • 查看这个链接,他们是通过 android docs.opencv.org/java/org/opencv/android/…, org.opencv.core.Mat, boolean 中的 util 包上的一个函数完成的
  • 这看起来是正确的做法! (我只知道很少的 OpenCV)你应该把它作为答案并将其标记为正确(对于其他有同样问题的人)!
【解决方案2】:

将任何数据类型转换为Mat的秘诀是了解以下constructor的要求:

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP)

Java 接口可能不提供完全相同的构造函数,但我确信基本原理仍然适用:

  • rows:图片的高度;
  • cols:图片的宽度;
  • type:数据的内部结构。例如,CV_8UC3 表示:无符号字符的 3 通道图像;
  • data:指向一维像素数组的指针。数组的数据类型必须与 type 上通知的数据类型相同。

  // pseudocode
  int width = getWidthOfBitmap();
  int height = getHeightOfBitmap();
  unsigned char* pixels = getDataOfBitmap();
  Mat image(height, width, CV_8UC1, pixels);

在这种情况下,CV_8UC1 表示单通道图像(即灰度)。

您将不得不调查Bitmap 的哪些方法返回这些信息。

【讨论】:

  • 他们通过下面的链接完成了一个功能。谢谢docs.opencv.org/java/org/opencv/android/…
  • 他们通过docs.opencv.org/java/org/opencv/android/…函数完成了
  • 如何将 on touch 坐标转换为 opencv 坐标。我已经浏览了这个 [link] (stackoverflow.com/questions/27279860/…) 但无法获得所需的结果。我想得到图像的 ROI 并做一些处理
  • 同样的数学运算,只需将这些数字更新为您拥有的数字即可。
  • 谢谢你,karlphillip,但我是双向的。首先,我通过将触摸坐标与 getwidth/getheight 相乘来转换触摸坐标,然后在 opencv 中我们再次将坐标乘以 outImg.rows / bitmap_row.where bitmap_row 是绘制图像时的实际行数。无论如何我都会得到结果。谢谢你
猜你喜欢
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
相关资源
最近更新 更多