Java中OpenCv:Mat的计算以及踩坑点

写在前面:最近做比赛,需要在Android手机上写一款图像处理的app,有处理算法的Matlab代码,所以其实只需要把算法从Matlab移植到Java就好了,

一开始有两种方案,方案一,直接使用Matlab Complier 导出Java上Matlab的运行环境,相当于手机上移植了一个小的“matlab”,乍一看很可行,其实不然。比如我在使用的过程就遇到了不少问题,比如一开始看重的用于管理生命周期的dispose方法,根本用不到(因为应用在前面就crash了…)如果要安卓手机没有自带Matlab Runtime的话(没听说有谁的手机自带啊),就要导入一个九百多M的Jar包,你没看错,就是九百多M!!恐怖如斯

方案二,也是我们今天的主角!OpenCv

1.Cvtype

CvType.CV_8U; // 8-每个元素占8位内存 U-元素为无符号unsigned int。默认单通道
CvType.CV_8UC1; // 8位 无符号 C1-单通道。C-Channel
CvType.CV_8UC2; // 8位 无符号 双通道,多用来操作黑白灰度图
CvType.CV_8UC3; // 8位 无符号3通道,多操作RGB图
CvType.CV_8UC4; // 4通道,RGBA图
CvType.CV_8S; // 8位 S-short类型。默认单通道
CvType.CV_8SC1; // 8位 short 单通道
CvType.CV_8SC2;
CvType.CV_8SC3;
CvType.CV_8SC4;
CvType.CV_16U; // 16位 无符号 默认单通道
CvType.CV_16UC1; // 16位 无符号 单通道
CvType.CV_16UC2; // 双通道
CvType.CV_16UC3;
CvType.CV_16UC4;
CvType.CV_16S; // 16位 short 默认单通道
CvType.CV_16SC1; // 16位 short 单通道
CvType.CV_16SC2; // 双通道
CvType.CV_16SC3;
CvType.CV_16SC4;
CvType.CV_32S; // 32位 short
CvType.CV_32SC1;
CvType.CV_32SC2;
CvType.CV_32SC3;
CvType.CV_32SC4;
CvType.CV_32F; // 32float
CvType.CV_32FC1;
CvType.CV_32FC2;
CvType.CV_32FC3;
CvType.CV_32FC4;
CvType.CV_64F; // 64float(ps:我使用的时候好像是double...)
CvType.CV_64FC1;
CvType.CV_64FC2;
CvType.CV_64FC3;
CvType.CV_64FC4;

简单理解一下参数,Cytype.CV_64FC4代表的是64位Float图,C4代表Channel 4,四通道图像。那Java开发的时候需要注意的地方有几个,我这里分别列出来:

  • 新建Mat对象时,最好指明大小和类型,方便后续排错

例如Mat mat = new Mat(1, 3, CvType.CV_8UC1);

后续进行计算时,在debug的你会知道这条其实往往是必须的;笔者当初就是吃了通道不匹配的亏,用Android Studio开发图片处理程序的时候,不仅需要离散傅里叶变换(DFT),还需要复数Mat的各种运算(sqrt、exp、multiply、subtract等等),疯狂报错,提示opencv not loading,一时间给我心态搞炸了。后面自己在网上找solution,跟网上这位老哥的情况是一样的,都是Core运算的时候通道(channel)或者位数不匹配。

 

  • Core.add()方法存在已知的问题,建议改用Core.addWeighted()

首先,说明一下Core.add(src1, src2, dst)方法的bug:只有当scr1 src2完全相同的时候,才能相加;否则,加法不会执行。详情见这里

关于改用Core.addWeighted()方法

addWeighted( src1, alpha, src2, beta, gamma, dst)

将进行如下计算


所以,刚刚谈到的add方法的替代,其实就是写成下面这样

Core.addWeighted( src1, 1, src2, 1, 0, dst);

 

作者: Henry

Learn to share and enjoy life, that's why I am here

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据