android studio bitmap转mat之后输入c++的opencv算法报错问题

项目场景:

将visual studio生成的opencv算法通过android studio打包成.so和.jar文件,供另一个安卓工程使用。


问题描述

函数运行不成功,报错

生成.so工程代码片段

//将RGB图转为灰度图
if (srcImgs.img_0.channels() == 3)
    cvtColor(srcImgs.img_0, srcImgs.img_0, COLOR_RGB2GRAY);
if (srcImgs.img.channels() == 3)
    cvtColor(srcImgs.img, srcImgs.img, COLOR_RGB2GRAY);

//二值化
Mat binary_0 = hateman_binaryzation(srcImgs.img_0);
Mat binary = hateman_binaryzation(srcImgs.img);

安卓工程调用的代码片段

bitmap_normal = BitmapFactory.decodeResource(getResources(), R.drawable.normal);
Mat bmpMat = new Mat();
Utils.bitmapToMat(bitmap_normal, bmpMat);

原因分析:

1、android 的opencv sdk和 c++的opencv sdk存在一些差异,一些函数返回的结果可能不同,也有可能是二者版本不一致

2、vs中代码跑通,as不行,忽略了一些细节

比如进行二值化时需要传入的是灰度图像,如果将RGB转灰度函数没有调用,就会出现问题,因此分析可能是通道数不是3


解决方案:

1、将c++ opencv库和java opencv库版本保持一致

2、打印获取到的通道数,看看是不是3

二者版本保持一致后,调用函数还是出错,然后打印获取到的通道数,发现结果是4,经百度发现,安卓的bitmap转mat函数调用后,通道是4,默认是CV_8UC4类型,即RGBA 4通道,将判断改为srcImgs.img_0.channels() == 4后,调用函数不再报错,问题解决。

你可能感兴趣的:(安卓调用opencv,android,studio,android,ide)