项目场景:
将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后,调用函数不再报错,问题解决。