Opencv2与opencv1的区别:

2024-01-01 09:32
文章标签 区别 opencv2 opencv1

本文主要是介绍Opencv2与opencv1的区别:,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:Opencv2与opencv1的区别:

Opencv1.0版本于2006年面世,主要基于C语言。2009年发布opencv2,主要基于C++。此时opencv库被划分成多个模块,这些模块被编译成库文件后,位于lib文件夹中。主要有以下模块(版本1的结构见我的这篇blog:http://blog.csdn.net/lu597203933/article/details/13614377):

Opencv_core模块:包含核心功能,尤其是底层数据结构和算法函数。

Opencv_improc模块:包含图像处理函数。

Opencv_highgui模块:包含读写图像及视频的函数,以及操作图形用户界面函数。

Opencv_features2d模块:包含兴趣点检测子,描述子以及兴趣点匹配框架。

Opencv_calib3d模块:包含相机标定,双目几何估计以及立体视觉函数。

Opencv_video模块:包含运动估算,特征跟踪以及前景提取函数与类。

Opencv_objdetect模块:包括物体检测函数,如脸部和行人检测。

库中还包含其它的工具模块,如机器学习(opencv_ml),计算几何(opencv_flann),第三方代码(opencv_contrib)等。这些模块都对有一个单独的头文件(位于include文件夹)。推荐的声明方式如下:

#include<opencv2\core\core.hpp>

#include<opencv2\highgui\highgui.hpp>

#include<opencv2\imgproc\imgproc.hpp>

而#include "cv.h"这是旧的代码方式,那是库还没有被划分为模块。

二:读取、显示和保存图片

(1)代码:

[cpp] view plain copy print ?
  1. #include <opencv2\core\core.hpp>
  2. #include <opencv2\highgui\highgui.hpp>
  3. #include <opencv2\imgproc\imgproc.hpp>
  4. #include <iostream>
  5. using namespace std;
  6. using namespace cv;
  7. int main()
  8. {
  9. Mat image = imread("F:\\tongtong.jpg", 1); //读取图片
  10. if(!image.data) // data指向已分配内存块的指针
  11. {
  12. cout << "fail to load image" << endl;
  13. }
  14. cout << "image size: " << image.size().height << "," << image.size().width << endl; //size()返回的是一个结构体
  15. namedWindow("show");
  16. imshow("show", image); // 显示图片
  17. imwrite("F:\\tongtong2.jpg", image);
  18. <span style="white-space: pre;"> </span>Mat result;
  19. flip(image,result, 0);
  20. namedWindow("result",0);
  21. imshow("result", result);
  22. waitKey(0);
  23. return 0;
  24. }
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{Mat image = imread("F:\\tongtong.jpg", 1);  //读取图片if(!image.data)                  // data指向已分配内存块的指针{cout << "fail to load image" << endl;}cout << "image size: " << image.size().height << "," << image.size().width << endl; //size()返回的是一个结构体namedWindow("show");imshow("show", image);       // 显示图片imwrite("F:\\tongtong2.jpg", image);Mat result;flip(image,result, 0);namedWindow("result",0);imshow("result", result);waitKey(0);return 0;	
}

(2)Explaination:

<1>opencv2中用于存储图像数据为Mat类型,而在opencv1中用IplImage(详细见我的这篇blog:http://blog.csdn.net/lu597203933/article/details/13957271)。优点在于Mat是一个类,定义的类类型可以自动分配和释放内存空间,而IplImage需手动为其分配和释放内存空间,当图像较多时,可能会有偏差,造成内存泄露。

<2>image.data是指向已分配的内存块的指针,当图片没有加载进来,则为NULL

<3>image.size()返回的是一个结构体,实际上包括width和height这两个成员变量。

<4>flip(image,result,0); //其中正数表示水平反转,0表示垂直反转,负数表示既有水平又有垂直反转。

(3)结果:

三:深浅拷贝

(1) 浅拷贝:

Mat B;

B = image ; // 第一种方式

Mat C(image); // 第二种方式

这两种方式称为浅copy,是由于它们有不同的矩阵头,但是它们共享内存空间,即指向一个矩阵。当图像矩阵发生变化时,两者相关联,都会变化。

(2) 深拷贝:

Mat B,C;

B = image.clone(); // 第一种方式

image.copyTo(C); // 第二种方式

深拷贝是真正的copy了一个新的图像矩阵,此时image,B,C三者相互没有影响。

四:IplImage装换为Mat

IplImage*iplImage = cvLoadImage("F:\\11.jpg",1);

Mat image2(iplImage,false);

// 其中false为浅拷贝,而true为深拷贝,默认为false。此时注意需要释放iplImage

当然opencv提供了另外一种指针类,无需手动释放,但现在已经不用了,可以使用它来封装IplImage指针:

Ptr<IplImage> iplImage = cvLoadImage("F:\\11.jpg",1);


作者:小村长 出处:http://blog.csdn.net/lu597203933 欢迎转载或分享,但请务必声明文章出处。 (新浪微博:小村长zack, 欢迎交流!)

这篇关于Opencv2与opencv1的区别:的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/558831

相关文章

C++中全局变量和局部变量的区别

《C++中全局变量和局部变量的区别》本文主要介绍了C++中全局变量和局部变量的区别,全局变量和局部变量在作用域和生命周期上有显著的区别,下面就来介绍一下,感兴趣的可以了解一下... 目录一、全局变量定义生命周期存储位置代码示例输出二、局部变量定义生命周期存储位置代码示例输出三、全局变量和局部变量的区别作用域

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

C++中NULL与nullptr的区别小结

《C++中NULL与nullptr的区别小结》本文介绍了C++编程中NULL与nullptr的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编... 目录C++98空值——NULLC++11空值——nullptr区别对比示例 C++98空值——NUL

Conda与Python venv虚拟环境的区别与使用方法详解

《Conda与Pythonvenv虚拟环境的区别与使用方法详解》随着Python社区的成长,虚拟环境的概念和技术也在不断发展,:本文主要介绍Conda与Pythonvenv虚拟环境的区别与使用... 目录前言一、Conda 与 python venv 的核心区别1. Conda 的特点2. Python v

Go语言中make和new的区别及说明

《Go语言中make和new的区别及说明》:本文主要介绍Go语言中make和new的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1 概述2 new 函数2.1 功能2.2 语法2.3 初始化案例3 make 函数3.1 功能3.2 语法3.3 初始化

深度解析Spring Boot拦截器Interceptor与过滤器Filter的区别与实战指南

《深度解析SpringBoot拦截器Interceptor与过滤器Filter的区别与实战指南》本文深度解析SpringBoot中拦截器与过滤器的区别,涵盖执行顺序、依赖关系、异常处理等核心差异,并... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现

Before和BeforeClass的区别及说明

《Before和BeforeClass的区别及说明》:本文主要介绍Before和BeforeClass的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Before和BeforeClass的区别一个简单的例子当运行这个测试类时总结Before和Befor

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio