java - android 位图和 opencv mat - 相同的代码不同的结果

标签 java android opencv android-bitmap mat

我写的代码是这样的:

  1. 获取位图
  2. 将其转换为 Mat
  3. 处理像素
  4. 将 Mat 转换为 Bitmap

此时我有两个分支。第一个将位图显示到 ImageView 中,第二个将位图保存在磁盘上,然后然后将位图显示到 ImageView 中。 尽管使用相同的代码,但我面临着不同的行为。我希望保存的位图能够像第一种情况一样保留颜色。 这是我正在使用的代码:

srcBitmap = ImageResizer.decodeSampledBitmapFromFile(imagePath,1024,1024,null);

src = new Mat(srcBitmap.getHeight(),srcBitmap.getWidth(),CvType.CV_8UC4);
dst = new Mat(srcBitmap.getHeight(),srcBitmap.getWidth(),CvType.CV_8UC4);

Utils.bitmapToMat(srcBitmap,src);
Utils.bitmapToMat(srcBitmap,dst);

double[] rgb;
for(i=0; i<src.height(); i++){
    for(j=0; j<src.width(); j++){
        rgb = src.get(i,j);

        r = rgb[0];
        g = rgb[1];
        b = rgb[2];
        a = rgb[3];
        .
        .
        .
        dst.put(i,j, r, g, b,a);
        }
}

Bitmap dstBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),Bitmap.Config.ARGB_8888);
Utils.matToBitmap(dst,dstBitmap);

第一种情况:只显示位图

imageView = (ImageView) findViewById(R.id.bitmap_preview);                
imageView.setImageBitmap(dstBitmap);

第二种情况:保存位图并显示

File newFile = fileHandler.getOutputMediaFile(FileHandler.MEDIA_TYPE_IMAGE);
FileOutputStream out = null;
try {
    out = new FileOutputStream(newFile);
    destBitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
    out.flush();
    out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
imageView = (ImageView) findViewById(R.id.bitmap_preview);                
imageView.setImageBitmap(ImageResizer.decodeSampledBitmapFromFile(fileHandler.getUriFromFile(newFile).getPath(),1024,1024,null));

谢谢

最佳答案

我通过这种方式改变 Mat 的初始化来解决这个问题:

    src = new Mat(bufferBitmap.getHeight(),bufferBitmap.getWidth(),CvType.CV_8U, new Scalar(4));
    dst = new Mat(bufferBitmap.getHeight(),bufferBitmap.getWidth(),CvType.CV_8U, new Scalar(4));

编辑

保存文件后请务必调用

MediaScannerConnection.scanFile(getActivity(), new String[]{file.toString()}, null, null);

以便操作系统可以正确索引新文件,更多详细信息请参见 this SO answer

关于java - android 位图和 opencv mat - 相同的代码不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38145118/

相关文章:

java - 为什么我使用看似简单的 StringTemplate 代码会收到 NullPointerException?

java - SQLite数据库错误: table has no column name

java - Android Studio - 尝试重新打开已关闭的对象: SQLiteDatabase

android - 在自定义渲染器中更改键盘的 Xamarin.Forms.Entry 的 ImeOptions 在 Android 上不起作用

java - Java 中的扩展接口(interface)和转换错误

android - Fused Location Provider - 非固定 wifi

python - 使用开放式CV在Python中进行背景提取

java - 当设备的配置文件更改时,如何触发事件?

c++ - std::vector 不会为多个 vector 条目创建 cv::Mat 的新引用 - 初始化矩阵时数据会被覆盖

Android 4.2 ndk : library loading crash: load_library(linker. cpp :750) || soinfo_link_image || libhoudini. 所以 ||打开简历