写了篇关于计算机图形学和OpenCV的帖子,处女作哦!! 使用C# unsafe代码重写OpenCV里的某些算法,并比较其和OpenCV算法的效率。有木有有兴趣的同学? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 忘了放地址了http://blog.csdn.net/wmesci/article/details/7009840 不错不错。只测50次是不是有点少呀,1千个ticks才零点几个毫秒,这么短的时间,预热时间也应该考虑一下了吧。OpenCV也是并行计算的吗?是不是.net的并行库效率上吃亏点?期待下一篇性能比较分析。 To jshi123: 预热时间已经考虑过了,计算时间时排除了第一次执行的时间。To caozhy(cfx) 感谢版主To bios8086(孤独的人) C++固然有C++的优势,如执行效率高、对程序的控制灵活、可以直接使用OpenCV库而不像C#那样需要经过封送处理、可以使用内嵌汇编以使用一些特殊指令集等,但C++经过长期的发展,一方面要向前兼容,一方面又要不断加入新特性,已经显出臃肿之态。C++感觉更像是面向过程和面向对象的杂糅体,如下面的代码: ClassA* a = NULL; a->DoSomething(); 如果DoSomething方法里没有使用this指针,那么这段代码是不会出错的,但这个语义上就让人感觉有些不爽了,对象都不存在,为何还能调用其方法? C#也并非一无是处,C#主要是适用于快速开发,非关键代码可以使用GC自动管理内存,关键代码可以使用unsafe代码自己管理内存,其效率不弱于C++。语言排行榜上C#使用率直逼C++即是明证。 个人感觉,C#相对C++缺点有以下几个: 1、unsafe代码中无法声明自定义类型的指针。 2、如果不加密的话,C#写的程序等同于开源。 感谢点评指正!! 推荐一个探讨,学习,分享OpenCV、OpenGL、CXImage等图形图像库的的使用技巧的群 52986334 To wjfwd2009(wjfwd2009) 由于CLR在第一次调用某个方法的时候要进行即时编译,所以第一次运行的速度会慢很多,因此在计算运行时间时要排除第一次调用。 To Heaven13483(尹海文) 基本上,50次取平均后,其变动范围就不超过正负100了,相对于数千Tick的运行时间,我想这个误差可以接受了。 第一没有测试代码。第二没有图片大小。第三没有图片格式。根据图片的格式去做处理。速度肯定比你这个要快很多。240M的bmp图片,灰度处理。在1.2s左右。csdn上前段时间也有一个模仿OpenCV的贴子。楼主可以看看。 中篇--原理分析,欢迎点评http://blog.csdn.net/wmesci/article/details/7011276 To zanfeng(秋色) 没有测试文件大小和测试代码是我的疏忽,吃完饭回来补上。 至于图片格式,我想这个是无关紧要的,无论是Image还是OpenCV,我都是等图片完全加载并灰度化处理之后再计时的,也就是说,不同文件格式的解码时间以及灰度化所需的时间没有计算在内。 可以给出那个帖子的地址吗? 感谢点评!! To zanfeng(秋色) 没有测试文件大小和测试代码是我的疏忽,吃完饭回来补上。 至于图片格式,我想这个是无关紧要的,无论是Image还是OpenCV,我都是等图片完全加载并灰度化处理之后再计时的,也就是说,不同文件格式的解码时间以及灰度化所需的时间没有计算在内。 可以给出那个帖子的地址吗? 感谢点评!! To xuchaoding(小刀): 貌似这是我第一次正式的写东西,“又”字何来?To l_wenb: 只是一些图片的基本操作最多对应opencv里面的一个函数。 To dizuo(Ren.Yafee) 恩是的,事实上,以我一人之力也不可能写出OpenCV那么全面的函数的,我只是想把openCV里我所用到的10来个函数用C#重写,如果效率可以接受的话,我的软件能脱离OpenCV库了。 不到500K的软件,却拖着一个10倍于己的OpenCV库,让人情何以堪!!! 不错,估计 Intel CPU OpenCV 或许能快一点点。当然,现在出到2.3.1了! OpenCV里使用了SSE指令集,C#里无法使用汇编指令,各位同学有什么办法优化没? 顺便贴一下最新优化过后的测试结果:CPU:AMD Athlon(tm) II X2 245 2.91GHz (双核)样本:1600 X 1200-------------------------------------Add 1.514 1.533Sub 1.225 1.163Mul 1.085 1.095Threshold 1.643 1.630Smooth 1.847 1.867AddWeighted 0.957 0.924CPU:AMD Athlon(tm) II X2 245 2.91GHz (双核)样本:600 X 896-------------------------------------Add 2.559 2.073 2.676Sub 2.240 1.784 1.856Mul 1.261 1.352 1.284Threshold 2.453 2.511 3.101Smooth 1.660 1.647 1.663AddWeighted 0.978 1.017 0.961CPU:Intel Core i3 M330 2.13GHz (双核四线程)样本:1600 X 1200-------------------------------------Add 2.611Sub 2.545Mul 1.011Threshold 2.882Smooth 1.891AddWeighted 0.525CPU:Intel Core i3 M330 2.13GHz (双核四线程)样本:600 X 896-------------------------------------Add 4.483Sub 3.576Mul 1.101Threshold 5.953Smooth 2.029AddWeighted 0.581 后边数字是Image方法执行时间和OpenCV相应方法执行时间的比值 求各位以后别争论语言了,面向对象是思想,C一样写出面向对象的代码来你用C++写不出来面向对象的代码来,只是因为没有思想用C#也有很多不懂面向对象的,静态类,设计的程序里从来没有抽象类,从来不存在重写抽象类的问题,至于接口,就更不知道干嘛的了,用面向过程写C#程序的大有人在, 我们公司也是做三维图像图形处理方面的,OpenCV是在核心的算法中用VC调用的,我主程序部分用C#,涉及到图像处理的很少,比如灰度话处理,我就是用Unsafe做的。 对OpenCV不了解,最好说一下,每个函数add,sub等之类的作用。 To zzyuri(zzyuri)To mjjackey(青蛙)感谢建议 我勒个去,用错号了,esci_NET(天悬星河)也是LZ我 无非还是优化问题,现在图像这一块除了算法原理上的优化,SSE指令集优化,还有很多从硬件上可以搞的手段了,多核了,又有了GPU了,比以前手段多了很多。真的要比执行速度,还是要基于相同的基础之上的,要么大家都用SSE,要不都不用。如果一个语言不能用SSE,不能用多线程,你那他的代码去和另外同时使用了这些的语言或工具比较没啥含义。 如果使用的算法相同,利用的硬件相同,不同语言不会有多大区别,无非就是一些加减乘除。 OpenCV是2.2开始有对多线程优化的,编译开关开了没有?你有没有用C++ Release版的程序进行测试。 To laviewpbt(人要靠自己(33184777)) 完全同意,但问题就在于C#不能用SSE,在这个前提下,我想看看C#的处理速度的极限是多少。后续修改中,想做成一个可扩展的构架,以便以后使用OpenCL/GPGPU/CUDA/DirectCompute等。To darkread(黑色阅读) 2.2的已经删了,现在用的是2.31的。我是直接使用Emgu附带的DLL文件来测试的,这个应该不会是Debug版吧?附文件大小,可以验证下: opencv_core231.dll 1.63 MB (1,715,200 字节) opencv_imgproc231.dll 1.55 MB (1,629,696 字节) 楼猪是不是还打算在嵌入式设备上安装一个windows还有.Net框架,然后才来运行你写的东东。 高分:modbus串口编程接收到的数据不完整问题 动态显示图形 怎么把数据库中的二进制流文件保存到磁盘呢 [Regex]匹配分组 - 2 如何获取主机系统服务列表`` c#自编写的window服务的问题,搞了四个小时没搞定:用installutilexe注册无法运行,而在IDE环境中运行时虽然报"无法从命令行或调试器启动服 100分求助~异步回调中改变主窗体值时发生错误 DataGrid标题头问题 学习C#,放分庆贺。 标题描述不清楚,请大神进来看 谢谢啦! 如何将byte[]类型存入数据库的blob中(C#) razor的变量中存储了html标签,如何让它自动识别为html
只测50次是不是有点少呀,1千个ticks才零点几个毫秒,这么短的时间,预热时间也应该考虑一下了吧。
OpenCV也是并行计算的吗?是不是.net的并行库效率上吃亏点?
期待下一篇性能比较分析。
预热时间已经考虑过了,计算时间时排除了第一次执行的时间。To caozhy(cfx)
感谢版主To bios8086(孤独的人)
C++固然有C++的优势,如执行效率高、对程序的控制灵活、可以直接使用OpenCV库而不像C#那样需要经过封送处理、可以使用内嵌汇编以使用一些特殊指令集等,但C++经过长期的发展,一方面要向前兼容,一方面又要不断加入新特性,已经显出臃肿之态。C++感觉更像是面向过程和面向对象的杂糅体,如下面的代码:
ClassA* a = NULL;
a->DoSomething();
如果DoSomething方法里没有使用this指针,那么这段代码是不会出错的,但这个语义上就让人感觉有些不爽了,对象都不存在,为何还能调用其方法?
C#也并非一无是处,C#主要是适用于快速开发,非关键代码可以使用GC自动管理内存,关键代码可以使用unsafe代码自己管理内存,其效率不弱于C++。语言排行榜上C#使用率直逼C++即是明证。
个人感觉,C#相对C++缺点有以下几个:
1、unsafe代码中无法声明自定义类型的指针。
2、如果不加密的话,C#写的程序等同于开源。
感谢点评指正!!
由于CLR在第一次调用某个方法的时候要进行即时编译,所以第一次运行的速度会慢很多,因此在计算运行时间时要排除第一次调用。
基本上,50次取平均后,其变动范围就不超过正负100了,相对于数千Tick的运行时间,我想这个误差可以接受了。
第二没有图片大小。
第三没有图片格式。
根据图片的格式去做处理。速度肯定比你这个要快很多。
240M的bmp图片,灰度处理。在1.2s左右。
csdn上前段时间也有一个模仿OpenCV的贴子。楼主可以看看。
中篇--原理分析,欢迎点评
http://blog.csdn.net/wmesci/article/details/7011276
没有测试文件大小和测试代码是我的疏忽,吃完饭回来补上。
至于图片格式,我想这个是无关紧要的,无论是Image还是OpenCV,我都是等图片完全加载并灰度化处理之后再计时的,也就是说,不同文件格式的解码时间以及灰度化所需的时间没有计算在内。
可以给出那个帖子的地址吗?
感谢点评!!
没有测试文件大小和测试代码是我的疏忽,吃完饭回来补上。
至于图片格式,我想这个是无关紧要的,无论是Image还是OpenCV,我都是等图片完全加载并灰度化处理之后再计时的,也就是说,不同文件格式的解码时间以及灰度化所需的时间没有计算在内。
可以给出那个帖子的地址吗?
感谢点评!!
貌似这是我第一次正式的写东西,“又”字何来?To l_wenb:
恩是的,事实上,以我一人之力也不可能写出OpenCV那么全面的函数的,我只是想把openCV里我所用到的10来个函数用C#重写,如果效率可以接受的话,我的软件能脱离OpenCV库了。
不到500K的软件,却拖着一个10倍于己的OpenCV库,让人情何以堪!!!
样本:1600 X 1200
-------------------------------------
Add 1.514 1.533
Sub 1.225 1.163
Mul 1.085 1.095
Threshold 1.643 1.630
Smooth 1.847 1.867
AddWeighted 0.957 0.924
CPU:AMD Athlon(tm) II X2 245 2.91GHz (双核)
样本:600 X 896
-------------------------------------
Add 2.559 2.073 2.676
Sub 2.240 1.784 1.856
Mul 1.261 1.352 1.284
Threshold 2.453 2.511 3.101
Smooth 1.660 1.647 1.663
AddWeighted 0.978 1.017 0.961
CPU:Intel Core i3 M330 2.13GHz (双核四线程)
样本:1600 X 1200
-------------------------------------
Add 2.611
Sub 2.545
Mul 1.011
Threshold 2.882
Smooth 1.891
AddWeighted 0.525
CPU:Intel Core i3 M330 2.13GHz (双核四线程)
样本:600 X 896
-------------------------------------
Add 4.483
Sub 3.576
Mul 1.101
Threshold 5.953
Smooth 2.029
AddWeighted 0.581
面向对象是思想,C一样写出面向对象的代码来
你用C++写不出来面向对象的代码来,只是因为没有思想
用C#也有很多不懂面向对象的,静态类,设计的程序里从来没有抽象类,从来不存在重写抽象类的问题,至于接口,就更不知道干嘛的了,用面向过程写C#程序的大有人在,
To mjjackey(青蛙)
感谢建议
如果使用的算法相同,利用的硬件相同,不同语言不会有多大区别,无非就是一些加减乘除。
你有没有用C++ Release版的程序进行测试。
完全同意,但问题就在于C#不能用SSE,在这个前提下,我想看看C#的处理速度的极限是多少。后续修改中,想做成一个可扩展的构架,以便以后使用OpenCL/GPGPU/CUDA/DirectCompute等。To darkread(黑色阅读)
2.2的已经删了,现在用的是2.31的。我是直接使用Emgu附带的DLL文件来测试的,这个应该不会是Debug版吧?附文件大小,可以验证下:
opencv_core231.dll 1.63 MB (1,715,200 字节)
opencv_imgproc231.dll 1.55 MB (1,629,696 字节)