使用C# unsafe代码重写OpenCV里的某些算法,并比较其和OpenCV算法的效率。有木有有兴趣的同学?

解决方案 »

  1.   

    忘了放地址了http://blog.csdn.net/wmesci/article/details/7009840
      

  2.   

    不错不错。
    只测50次是不是有点少呀,1千个ticks才零点几个毫秒,这么短的时间,预热时间也应该考虑一下了吧。
    OpenCV也是并行计算的吗?是不是.net的并行库效率上吃亏点?
    期待下一篇性能比较分析。
      

  3.   

    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#写的程序等同于开源。
        感谢点评指正!!
      

  4.   

    推荐一个探讨,学习,分享OpenCV、OpenGL、CXImage等图形图像库的的使用技巧的群 52986334
      

  5.   

    To wjfwd2009(wjfwd2009)
        由于CLR在第一次调用某个方法的时候要进行即时编译,所以第一次运行的速度会慢很多,因此在计算运行时间时要排除第一次调用。
      

  6.   

    To Heaven13483(尹海文)
        基本上,50次取平均后,其变动范围就不超过正负100了,相对于数千Tick的运行时间,我想这个误差可以接受了。
      

  7.   

    第一没有测试代码。
    第二没有图片大小。
    第三没有图片格式。
    根据图片的格式去做处理。速度肯定比你这个要快很多。
    240M的bmp图片,灰度处理。在1.2s左右。
    csdn上前段时间也有一个模仿OpenCV的贴子。楼主可以看看。
      

  8.   


    中篇--原理分析,欢迎点评
    http://blog.csdn.net/wmesci/article/details/7011276
      

  9.   

    To zanfeng(秋色)
        没有测试文件大小和测试代码是我的疏忽,吃完饭回来补上。
        至于图片格式,我想这个是无关紧要的,无论是Image还是OpenCV,我都是等图片完全加载并灰度化处理之后再计时的,也就是说,不同文件格式的解码时间以及灰度化所需的时间没有计算在内。
        可以给出那个帖子的地址吗?
        感谢点评!!
      

  10.   

    To zanfeng(秋色)
      没有测试文件大小和测试代码是我的疏忽,吃完饭回来补上。
      至于图片格式,我想这个是无关紧要的,无论是Image还是OpenCV,我都是等图片完全加载并灰度化处理之后再计时的,也就是说,不同文件格式的解码时间以及灰度化所需的时间没有计算在内。
      可以给出那个帖子的地址吗?
      感谢点评!! 
      

  11.   

    To xuchaoding(小刀):
        貌似这是我第一次正式的写东西,“又”字何来?To l_wenb:
        
      

  12.   

    只是一些图片的基本操作最多对应opencv里面的一个函数。
      

  13.   

    To dizuo(Ren.Yafee)
        恩是的,事实上,以我一人之力也不可能写出OpenCV那么全面的函数的,我只是想把openCV里我所用到的10来个函数用C#重写,如果效率可以接受的话,我的软件能脱离OpenCV库了。
        不到500K的软件,却拖着一个10倍于己的OpenCV库,让人情何以堪!!!
      

  14.   

    不错,估计 Intel CPU OpenCV 或许能快一点点。当然,现在出到2.3.1了!
      

  15.   

        OpenCV里使用了SSE指令集,C#里无法使用汇编指令,各位同学有什么办法优化没?
      

  16.   

    顺便贴一下最新优化过后的测试结果:CPU:AMD Athlon(tm) II X2 245 2.91GHz (双核)
    样本: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
      

  17.   

    后边数字是Image方法执行时间和OpenCV相应方法执行时间的比值
      

  18.   

    求各位以后别争论语言了,
    面向对象是思想,C一样写出面向对象的代码来
    你用C++写不出来面向对象的代码来,只是因为没有思想
    用C#也有很多不懂面向对象的,静态类,设计的程序里从来没有抽象类,从来不存在重写抽象类的问题,至于接口,就更不知道干嘛的了,用面向过程写C#程序的大有人在,
      

  19.   

    我们公司也是做三维图像图形处理方面的,OpenCV是在核心的算法中用VC调用的,我主程序部分用C#,涉及到图像处理的很少,比如灰度话处理,我就是用Unsafe做的。
      

  20.   

    对OpenCV不了解,最好说一下,每个函数add,sub等之类的作用。
      

  21.   

    To zzyuri(zzyuri)
    To mjjackey(青蛙)
    感谢建议
      

  22.   

    我勒个去,用错号了,esci_NET(天悬星河)也是LZ我
      

  23.   

        无非还是优化问题,现在图像这一块除了算法原理上的优化,SSE指令集优化,还有很多从硬件上可以搞的手段了,多核了,又有了GPU了,比以前手段多了很多。真的要比执行速度,还是要基于相同的基础之上的,要么大家都用SSE,要不都不用。如果一个语言不能用SSE,不能用多线程,你那他的代码去和另外同时使用了这些的语言或工具比较没啥含义。
         如果使用的算法相同,利用的硬件相同,不同语言不会有多大区别,无非就是一些加减乘除。
      

  24.   

    OpenCV是2.2开始有对多线程优化的,编译开关开了没有?
    你有没有用C++ Release版的程序进行测试。
      

  25.   

    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 字节)
      

  26.   

    楼猪是不是还打算在嵌入式设备上安装一个windows还有.Net框架,然后才来运行你写的东东。