之前使用的一直都是matlab,可是在工程上基本还是用c,所以为了将编好的程序转换成c语言,配合opencv的使用,就发生了今天的matlab转c的尝试。(虽然很想说当初直接用opencv写不就好了,可谁让我当时只会matlab呢先转个试试吧,不行我再去写好了) 在命令窗口键入mex -setup ,注意,这里的mex后有一个空格,不然就会出现如下提示: 选择语言之后键入coder回车就会出现转换界面了。 其实这样好麻烦的说,后来发现我现在用的是matlab2017,应该更早的版本里也有,就是MATLAB coder这个APPS,直接点就行了。 在打开MATLAB coder的APP时出现了一个问题,在某一个文件夹的路径下无法打开,一点击图标就自动运行函数了,而换一个路径就没有问题了。后来发现,原来是因为我为了尝试coder的使用步骤随便捡建了一个草稿,命名就是coder,这样一来可不就是点图标相当于运行程序了么。这个问题还真是要注意,有时起名字不注意就会和matlab中自带的函数重名,这样调用时就会出错,还一时发现不了,最后发现了也是无奈至极 简单的程序很容易就转换出来了,整体的步骤还是很容易的,跟着指示做就好了。之后要做的就是把自己的单应性矩阵的计算程序进行转换。
同学说她以前转换一行指令就完成了,用的是mcc,但是在2017里输这行指令时就出现下面这个提示,所以是高版本的不支持了么?求解~~~
因为我要转换的matlab函数里调用了相机标定的函数,在低版本里应该是没有的才对。好吧,就算是用coder也还是会出现有的函数不支持转化的情况。比如说这个varargin函数就提示说不支持。下面的步骤转化的是我自己的了,因为不确定相机标定函数可不可以转,所以先把归一化和单应性的转了一下 Numeric Conversion那里还是不要动了,除了none别的都会和程序里的类型冲突。next之后会发现程序里有错的地方,这个程序在matlab里运行是没问题的,这里报错肯定就是和转化过程有关了,它让你怎么改就改一下好了。 比较麻烦的就是函数不支持,未定义的直接加个定义就好了。我这里把不支持的函数换了一种别的方式表达,直接在这个界面改就可以保存在程序里了。 据说在程序中写%#codegen是为了检查代码的可转换性,我也象征性的写了一下,但没有看到什么实质作用,毕竟APP里已经有了检查的步骤了。 下面要加的是运行要转化的function的主函数文件,会显示function里的输入参数类型。很悲催,我想转的的文件function ip=singlecorrect(i1,i2,cameraParams)里cameraparams的输入是个类,matlab可以用,但是不支持转化,所以我在这一步崩溃了看来还要再想点别的办法。 要是没有那个参数,下一步在检查之后就可以生成了,记得要把生成成功的文件打包,不然太乱了。 总之,code的用法大概就是这样,我卡在了load数据上,目前时间紧张,找不到好办法了,以后有时间再回来看看怎么能改进一下吧。 好在还是转好了一部分,剩下的也不难,直接去opencv里编一下,这样可能都比找方法转c快 后续:查了一下,load函数貌似就是不能直接转到c里用,mat文件也要先转成xml/yml也才能调用。。。本以为转好的那部分程序在使用过程中也遇到了问题,matlab里的svd计算在c里不能正常使用,虽然opencv里有它自己svd的计算方法,但是为了避免再遇到奇奇怪怪的bug,最后我还是自己重新编了一整套的opencv计算两幅图像单应性的程序,感觉比转码方便多了。。。珍爱生命,远离转码,该在哪的还是就在哪好了。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论