zoukankan      html  css  js  c++  java
  • 总结系列_3(opencv中c版本和c++版本区别体验,续...)

      1.  显示窗口大小的改变方法不同。

      在c版本中,定义一个窗口时用cvNamedWindow.

      比如说cvNamedWindow(“src”,0);后面的参数为0表示窗口大小可以手动改变,否则窗口的大小是自适应图片大小的。

      而在c++版本中定义一个窗口用namedWindow.

      比如说namedWindow(“src”,1);不管后面第二个参数是多少,都不能手动更改窗口的大小,因为它的尺寸是根据图片大小自动生成的。

         并且要看到手动调整窗口大小的效果,还需要配合cvShowImage(“src”,img);

      也就是说如果后面显示用c++版本的imshow(“src”,img);也是看不到手动调整图片大小的效果的。

     

      2.  显示图片的函数不同。

      在opencv的c版本中,显示图片用cvShowImage;

      比如说,cvShowImage(“src”,img);

      并且这里的img是IplImage*类型,所以如果你定义的img是Mat类型的话就用不了,因为程序不能自动将Mat类型转换成IplImage*类型。

      在opencv的c++版本中,显示图片用的是imshow;

      比如说,imshow(“src”,img);

      当然这里的img就是Mat类型了。也就是说如果这里的img用IplImage*就不行了,程序不能自动将IplImage*转换成Mat类型。

      通过上面2点应该注意到,如果要手动改变图片的尺寸,就必须cvNamedWidow(“src”,0);

      cvShowImage(“src”,img)一起用。其中img是IplImage*类型。

         当然cvNamedWindow(“src”,0)也可以和imshow(“src”,img)一起用,其中img是Mat类型,但是这样达不到自动改变窗口大小的目的。

      因为一般情况下,namedWindow(“src”,1)和imshow(“src”,img)一起用的。

      下面来看看IplImage结构体内部:

    int 

    nSize

    int 

    ID

    int 

    nChannels

    int 

    alphaChannel

    int 

    depth

    char 

    colorModel [4]

    char 

    channelSeq [4]

    int 

    dataOrder

    int 

    origin

    int 

    align

    int 

    width

    int 

    height

    struct _IplROI

    roi

    struct _IplImage

    maskROI

    void * 

    imageId

    struct _IplTileInfo * 

    tileInfo

    int 

    imageSize

    char * 

    imageData

    int 

    widthStep

    int 

    BorderMode [4]

    int 

    BorderConst [4]

    char * 

    imageDataOrigin

      而Mat结构体包含一个Mat头部(头部中记录的是矩阵的大小,存储方式等等)和一个指向矩阵的指针。所以2者还是有很大区别的,所以说程序不能自动将他们转换是有原因的,因为Mat结构更加复杂。

     

      3. 读取图片的方式不同。

      在c版本中读取图片用的是cvLoadImage;

      比如说cvLoadImage(“lena.jpg”);

      在c++版本中,读取图片用的是imread;

      比如说imread(“lena.jpg”);

      当然这2种的lena图片都是放入工程目录下的。

      但是这里有一点非常不同的是,cvLoadImage()中的参数为const char*类型,而imread()中的参数是const &string型,这两种是完全不同的,在opencv中也不能自动转换好他们,混合使用c和c++函数一起编写opencv代码时要小心。

     

      4. 路径表示方式不同。

      在c版本中路径之间用2个双右斜线,即”//”。用1个斜线”/”会报错。

      在c++版本中路径之间用1个或者2个甚至更多个斜线都是可以的。

      5. c版本的OpenCV只能同时对图片设置一个感兴趣的区域ROI,而C++版本的OpenCV可以同时设置几个ROI。另外在复制的时候,c版本的OpenCV中如果设定了ROI等参数的时候,cvCopy只是复制被设定的区域,复制到一个和所设定参数相吻合的新的IplImage中,而cvClongImage则是将整个IplImage结构复制到新的IplImage中,其中的ROI等参数也会一同复制。新的IplImage将会和原来的一模一样。

     

     

     

     

     

  • 相关阅读:
    有用数据结构---图的操作和算法
    Jackson 框架,轻易转换JSON
    移动Web开发实践
    Spring官方文档翻译——15.1 介绍Spring Web MVC框架
    面向对象五大原则_1.单一职责原则&2.里氏替换原则
    ZOJ 3792 Romantic Value 最小割(最小费用下最小边数)
    Yii学习笔记之二(使用gii生成一个简单的样例)
    一个令人蛋疼的NDK链接错误
    Android 阅读器架构图,网上收集,留做存货
    Xcode 6 打包ipa文件
  • 原文地址:https://www.cnblogs.com/tornadomeet/p/2476277.html
Copyright © 2011-2022 走看看