目前做IOS、Android上的软件,需要将Windows下的算法移植到各个平台下,在移植的过程中,发现Opencv这个破开源软件的坑爹之处真多!!!
发现一个,就在下面列一个,不断更新吧:
-----------------------IOS 版本------------------------
1、cvGet2D
cvGet2D返回的是一个cvscalar类型的变量,在Windows下,像素值是按RGB存储的,即pixel.val[0]=R,pixel.val[1]=G,pixel.val[2]=B。而在IOS下,这货是TMD反的!!即pixel.val[0]=B,pixel.val[1]=G,pixel.val[2]=R!!导致我在移植的时候花了半天的时间,抱着试试看的心态给发现了,NND,开源的东西就是不靠谱!!!
///更正一下
不是上面的问题,ios下是UIimage对象,同事从网上找的代码将UIimage转换成IplImage对象,其中调用了cv_rgba2rgb,导致上面的问题。将其改为 cv_rgba2bgr,生成的iplimage对象就和windows和android版本一致了。坑爹的网上源代码,冤枉Opencv了,sorry
3、cvCopyImage
这破b函数在windows下没问题,到了IOS就傻b,死机还是啥来着,忘了。改成cvcopy就可以了。
4、pow函数
和Opencv没关系,也放在这说吧。记不太清了,如果变量是double等浮点型的话,pow的倍数也得设置成浮点型,比如pow(a,2.0)。(a是整型,2还是2.0来着,忘了)。在windows下,pow(a,2)就没问题。
这个错误很好解决,ios下编译会报错,把2改成2.0就好了。当然,要是不知道什么原因,郁闷死你!
--------------------Android版本-------------------------------------
android结合C++代码的麻烦程度就不多说了,反正不是我来折腾。但代码就得是我了:(
1、图像通道问题
据同事说,android下就那么几个格式的Bitmap对象,通过跟踪代码发现,android传递给C++的对象都是4通道的图像,如果不处理第4通道的话,就会黑屏!所以,在对图像处理的时候,不能像opencv似地不管第4通道,必须对第4通道赋值:直接将源图第4通道值对应拷贝过去就行。
2、cvCvtColor
Opencv做为开源软件恶心之处又一体现!cvCvtColor在windows下随便,各种颜色格式随便转换都行。但到了Android下,就会程序崩溃!!只有RGB2Gray,RGB2RGBA那么有限几个才不会崩溃。要想在Android下使用,就得自己重新实现cvCvtColor这个函数,或者调用Opencv在java版本下的cvtColor函数。。。。。