用C++和python开发opencv程序比较?
程序员文章站
2022-05-12 13:12:06
...
用C++和python开发opencv程序有什么区别?大家做个比较吧!
——————————以下由刘铲铲提问——————————
用C++和python开发opencv,
1.哪个更容易上手?
2.代码运行的效率差距大吗?
3.两个语言对应的openCV的库有不同吗?
4.对于非程序员的研究人员,想要开发一个视觉产品,选用哪个比较好?
两者主要的区别在于接口和效率。
实际上Python和C++的OpenCV接口几乎一样,不同的是用C++的话,矩阵用的是cv::Mat,Python里面用的是numpy.array,用法和接口都不一样,但文档丰富,使用也非常方便,原理也相似。
效率方面,Python的接口实际上只是一层Binding,最终还是调用libopencv_*.so里面的函数,所以在OpenCV这一层效率与C++是完全一致的。唯一不同的就是它的numpy.array和cv::Mat。Numpy底层也是使用C Extension的方法写,但相比C++版的OpenCV接口,Python的接口需要把Numpy的数据转化成OpenCV的C接口可接受的输入。
实测Python写的程序会慢,但具体慢多少并没有测试数据可支撑。
用Python写实际上也不会比C++开发快多少,因为接口都是一样的,我建议不如直接用C++写。
我后面选Python实际上只是想试一下Python接口而已。 1.一个尿性,库本身的差别并不大。
2.因为都是调的库,差别仍旧不大。说用numpy.array的,并不是唯一选择,实际上仍然有Mat类,你也可以直接使用,并不一定要用numpy.array。坦白说,从效率来看,因为numpy有numba神器,有可能比cv.Mat更快。然而限制所在在于GIL以及非库运算中的速度限制。例如你非要写几个for循环而不愿意用array/Mat的相关函数算符,慢一点也是没办法的。由于GIL的存在,OpenCV在py上跑单个进程就被控在单核里了,多线程基本上没啥用,提高效率往往要多进程,手法娴熟可能效率差距不大,太生僻有可能写出慢十几倍多玩意来。
3. 库其实是一样的PyOpenCV只是一层封装而已。
4. Python写着快但是其实坑很多。如果你说的「产品」是生产环境下工作的,而你自身对python的了解又不够深入,那么选择C++会更好。如果你很了解python了,或者说主要做快速成型验证想法之类的活儿,Python有着写起来省时省力的优势,毕竟动态类型提供的方便足够多,熟悉的话不会踩坑/不在意踩坑的话自然是怎么方便怎么来。 简单说两句,选python还是C++,考虑下面几个问题
1. 性能压力在哪里?python的GIL使得多线程不能多核并行,必须用多进程,而且天生python要比c++慢一些。因此如果是cpu密集型,建议用C++,如果是IO密集型,python没有那么大的劣势。
2. 开发成本高还是运行成本高,一个开发人员一个月多少钱,一个服务器一个月多少钱,通常来说前者越来越贵而后者反之,权衡下利弊,C++开发要比python慢,在性能都达标的情况下,如果节省的服务器成本能抵过开发成本,用C++,反之用python。 一般都是Python做实验、调试什么的,定型后就用C++写了 1,差不多,基本调用参数都一样,格式符合各自语言规范。
2,在我开发的程序中python比cpp明显有差距,但是换到工作用的电脑上这个差距就看不错来了,so,硬件配置好一些,用python做实时也是没有问题的。外,感觉同样的函数python就是比cpp慢一些,虽然上面说到python底层用的也是lib。
3,基本一样。(python可能功能稍微差一点2.4.8版本有个函数没在python中找到,但是也就那一个)
4,python比较简单,开发可能快一点(主要是软件的其他部分可能比较容易开发)。 我觉得PYTHON很好。主要的好处是它的支持库太多了。对于开发原型产品,理解算法是非常有帮助的。
——————————以下由刘铲铲提问——————————
用C++和python开发opencv,
1.哪个更容易上手?
2.代码运行的效率差距大吗?
3.两个语言对应的openCV的库有不同吗?
4.对于非程序员的研究人员,想要开发一个视觉产品,选用哪个比较好?
回复内容:
我的毕业设计就是用OpenCV 2写的,前期使用C++写了个Demo,最后的成品是用Python 2写的。两者主要的区别在于接口和效率。
实际上Python和C++的OpenCV接口几乎一样,不同的是用C++的话,矩阵用的是cv::Mat,Python里面用的是numpy.array,用法和接口都不一样,但文档丰富,使用也非常方便,原理也相似。
效率方面,Python的接口实际上只是一层Binding,最终还是调用libopencv_*.so里面的函数,所以在OpenCV这一层效率与C++是完全一致的。唯一不同的就是它的numpy.array和cv::Mat。Numpy底层也是使用C Extension的方法写,但相比C++版的OpenCV接口,Python的接口需要把Numpy的数据转化成OpenCV的C接口可接受的输入。
实测Python写的程序会慢,但具体慢多少并没有测试数据可支撑。
用Python写实际上也不会比C++开发快多少,因为接口都是一样的,我建议不如直接用C++写。
我后面选Python实际上只是想试一下Python接口而已。 1.一个尿性,库本身的差别并不大。
2.因为都是调的库,差别仍旧不大。说用numpy.array的,并不是唯一选择,实际上仍然有Mat类,你也可以直接使用,并不一定要用numpy.array。坦白说,从效率来看,因为numpy有numba神器,有可能比cv.Mat更快。然而限制所在在于GIL以及非库运算中的速度限制。例如你非要写几个for循环而不愿意用array/Mat的相关函数算符,慢一点也是没办法的。由于GIL的存在,OpenCV在py上跑单个进程就被控在单核里了,多线程基本上没啥用,提高效率往往要多进程,手法娴熟可能效率差距不大,太生僻有可能写出慢十几倍多玩意来。
3. 库其实是一样的PyOpenCV只是一层封装而已。
4. Python写着快但是其实坑很多。如果你说的「产品」是生产环境下工作的,而你自身对python的了解又不够深入,那么选择C++会更好。如果你很了解python了,或者说主要做快速成型验证想法之类的活儿,Python有着写起来省时省力的优势,毕竟动态类型提供的方便足够多,熟悉的话不会踩坑/不在意踩坑的话自然是怎么方便怎么来。 简单说两句,选python还是C++,考虑下面几个问题
1. 性能压力在哪里?python的GIL使得多线程不能多核并行,必须用多进程,而且天生python要比c++慢一些。因此如果是cpu密集型,建议用C++,如果是IO密集型,python没有那么大的劣势。
2. 开发成本高还是运行成本高,一个开发人员一个月多少钱,一个服务器一个月多少钱,通常来说前者越来越贵而后者反之,权衡下利弊,C++开发要比python慢,在性能都达标的情况下,如果节省的服务器成本能抵过开发成本,用C++,反之用python。 一般都是Python做实验、调试什么的,定型后就用C++写了 1,差不多,基本调用参数都一样,格式符合各自语言规范。
2,在我开发的程序中python比cpp明显有差距,但是换到工作用的电脑上这个差距就看不错来了,so,硬件配置好一些,用python做实时也是没有问题的。外,感觉同样的函数python就是比cpp慢一些,虽然上面说到python底层用的也是lib。
3,基本一样。(python可能功能稍微差一点2.4.8版本有个函数没在python中找到,但是也就那一个)
4,python比较简单,开发可能快一点(主要是软件的其他部分可能比较容易开发)。 我觉得PYTHON很好。主要的好处是它的支持库太多了。对于开发原型产品,理解算法是非常有帮助的。