opencv2.4.8参考手册(一) 简介
简介 Opencv (Open Source Computer Vision Library: http://opencv.org)是一个包含几千个计算机视觉算法的开源库,本文档讲述的是所谓的OpenCV 2.X 接口,与基于C语言的OpenCV 1.X接口不同,这是一个基于C的编程接口。 opencv是库组织结构,也就是说Opencv
简介
Opencv (Open Source Computer Vision Library: http://opencv.org)是一个包含几千个计算机视觉算法的开源库,本文档讲述的是所谓的OpenCV 2.X 接口,与基于C语言的OpenCV 1.X接口不同,这是一个基于C++的编程接口。
opencv是库组织结构,也就是说Opencv包含一些共享或者静态的库。可用的库如下 :
core - 一个定义最基本数据结构的库,包括密集的多维矩阵Mat,和一些被其他库用到的基本函数
imgproc - 图像处理库,包含线性非线性的图像滤波,图像几何变换(调整尺寸,仿射变换,透视变换,基本的基于表格的重映射),颜色空间转换,直方图等
video - 视频分析库,包括运动估计,背景差值,和物体追踪算法
calib3d - 基本的多视角几何算法,单摄像机和立体摄像机的标定,物体姿态估测,立体匹配算法和元素的三维重建。
features2d - 特征探测子,描述子,以及描述子匹配
objdetect - 对于预定义类的实例或对象的检测(如人脸,眼睛,mugs,人,汽车等)
highgui - 简单易用的视频捕捉接口,图像'视频的编解码器,以及简单的UI函数
gpu - 不同opencv库中基于GPU加速的算法
... - 其他一些帮助库,如FLANN 和Google test wrappers,python绑定等
在后续的章节中会描述各个模块的函数功能,但是一开始你应该熟悉贯穿整个库中最基本的API概念。
1.1 API 概念
cv 命名空间
所有的opencv类和函数是被放置在cv命名空间的,所以为了在你的程序中使用它们,需要用cv::来指明或者直接这样using namespace cv;
#include "opencv2/core/core.hpp" ...
cv::Mat H = cv::findHomography(points1, points2, CV_RANSAC, 5); ... 或者
#include "opencv2/core/core.hpp" using namespace cv; ... Mat H = findHomography(points1, points2, CV_RANSAC, 5); ...
Mat a(100, 100, CV_32F); randu(a, Scalar::all(1), Scalar::all(std::rand())); cv::log(a, a); a /= std::log(2.);
opencv自动处理所有的内存。
首先,std::vector,Mat,和其他被函数或方法用到的数据结构会有在必要时释放相关内存的析构函数,析构函数并不总去释放内存,拿Mat来举例子,考虑到可能的数据共享,析构函数会递减矩阵数据缓冲区的引用计数器,而只有在引用计数器为0时,也就是没有其他的结构指向该缓冲区,缓冲区才会被释放,类似地,当一个Mat实例被复制,实际数据并没有真正被拷贝,相反,缓冲区的引用计数器递增来表明这个缓冲区被另一个拥有者所分享。当然也有Mat::clone方法是创建矩阵数据的整个拷贝,见下面的例子:
// create a big 8Mb matrix Mat A(1000, 1000, CV_64F); // create another header for the same matrix; // this is an instant operation, regardless of the matrix size. Mat B = A; // create another header for the 3-rd row of A; no data is copied either Mat C = B.row(3); // now create a separate copy of the matrix Mat D = B.clone(); // copy the 5-th row of B to C, that is, copy the 5-th row of A // to the 3-rd row of A. B.row(5).copyTo(C); // now let A and D share the data; after that the modified version // of A is still referenced by B and C. A = D; // now make B an empty matrix (which references no memory buffers), // but the modified version of A will still be referenced by C, // despite that C is just a single row of the original A B.release(); // finally, make a full copy of C. As a result, the big modified // matrix will be deallocated, since it is not referenced by anyone C = C.clone();
T* ptr = new T(...); you can use: Ptr<t> ptr = new T(...);</t>
输出数据的自动内存分配
opencv自动释放内存,同样大部分时候也为输出函数的参数自动分配内存,所以如果一个函数有一个或多个输入数组(cv::Mat 实例)和一些输出数组,输出数组会被自动分配或重分配内存。输出数组的大小和类型由输入数组决定。如果需要,函数还会接受额外参数来表明输出数组的属性
例子:
#include "cv.h" #include "highgui.h" using namespace cv; int main(int, char**) { VideoCapture cap(0); if(!cap.isOpened()) return -1; Mat frame, edges; namedWindow("edges",1); for(;;) { cap >> frame; cvtColor(frame, edges, CV_BGR2GRAY); GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5); Canny(edges, edges, 0, 30, 3); imshow("edges", edges); if(waitKey(30) >= 0) break; } return 0; }
这个技术的关键组件就是Mat::create方法,它接受期望的大小和类型,如果数组已经有特定的大小和类型,那么该方法什么也不做,否则它就会释放先前的分配的数据(递减引用计数器并与0比较),然后申请分配一块新的指定大小的事缓冲区。大部分函数都会为每一个输出数组调用Mat::create方法,这也是解释了输出数组的自动内存分配机制。
一些需要注意的特例就是cv::mixChannels, cv::RNG::fill和其他一些函数和方法,它们并不会为输出数组分配内存,所以你需要事先分配。
饱和算术
作为一个计算机视觉库,opencv经常要处理的图像像素点往往是紧凑的,8位或才16位每通道形式的数据,这样就要求限制数据的取值范围,进一步说,图像的特定操作(如颜色空间转换,亮度/对比度调整,锐化,复杂的内插(bi-cubic, Lanczos))会产生超出可接受的数据范围,如果你只能够存储结果的低8位抑或是16位,这会导致视觉缺陷或者更进一步影响到后续的分析处理,为了解决这个问题,所谓的饱和算术派上用场了,如,为了存储r(8位的图像数据),以下操作会让你在0~255内找到最接近真实值的值。
I(x; y) = min(max(round(r); 0); 255)
同样的规则也被用来处理有符号8位,有符号16位和无符号类型,这样的语义在库中随处可见,在C++语言中,用的是类标准C++中类型转换操作的saturate_cast,看下面对于 上面方程的实现:
I.at
cv::uchar是opencv中8位无符号类型,
固定的像素类型,限制使用模板
模板是c++中用来实现强大,高效并且安全数据结构和算法的伟大特征,但是过度的模板使用又会导致编译时间变长和代码量变大,此外,it is difficult to separate an interface and implementation when templates are used exclusively(??),当然这对基本的算法没什么问题,但是对于一个算法就拥有几千行代码的计算机视觉库来说,是不适用的,正因为如此,也因为简化与其他语言的绑定开发(像python,jave,matlab这些压根就没有模板的语言),当前的opencv是基于多态性的运行时动态绑定的实现,在这些动态绑定过慢(like pixel access operators),、不可能(generic Ptr implementation)或者压根就不方便(saturate_cast())的地方,opencv实现就介绍小的模板类、方法和函数,而opencv 的其他地方则限制了模板的使用。
因此,计算机视觉库可以操作的数据类型是一组有限的、固定的基本数据类型。那就是数组元素需要是以下类型:
? 8-bit unsigned integer (uchar)
? 8-bit signed integer (schar)
? 16-bit unsigned integer (ushort)
? 16-bit signed integer (short)
? 32-bit signed integer (int)
? 32-bit floating-point number (float)
? 64-bit floating-point number (double)
? 元组数据类型,元组里的元素的类型(以上一种)是一致的,图像数组就是元组的一种,被叫作多通道数组,以区分单通道数组。最大的可能通道数是用宏CV_CN_MAX定义的,当前版本设置为512
对于这此基本的类型,下面的枚举可以使用:
enum { CV_8U=0, CV_8S=1, CV_16U=2, CV_16S=3, CV_32S=4, CV_32F=5, CV_64F=6 };
多通道类型可以用下面选项来指定:
? CV_8UC1 ... CV_64FC4 常数(通道数据1-4)
? CV_8UC(n) ... CV_64FC(n) or CV_MAKETYPE(CV_8U, n) ... CV_MAKETYPE(CV_64F, n) 当通道数大于4或者编译时不可知即变量可用这些宏
注意:CV_32FC1 == CV_32F, CV_32FC2 == CV_32FC(2) == CV_MAKETYPE(CV_32F, 2), and
CV_MAKETYPE(depth, n) == ((x&7)
Mat mtx(3, 3, CV_32F); // make a 3x3 floating-point matrix Mat cmtx(10, 1, CV_64FC2); // make a 10x1 2-channel floating-point // matrix (10-element complex vector) Mat img(Size(1920, 1080), CV_8UC3); // make a 3-channel (color) image // of 1920 columns and 1080 rows. Mat grayscale(image.size(), CV_MAKETYPE(image.depth(), 1)); // make a 1-channel image of // the same size and same
更复杂元素的数组是不能被opencv构造或处理的,或者说,各个函数或方法只能处理上述数组类型的子集,一个算法越复杂,那么它所支持的类型子集就越小,看下面典型例子:
人脸检测算法只能处理8位的灰度图像或者彩色图像
线性代数函数和大部分机器学习算法只能处理浮点型数据
基本函数,如cv::add,支持所有类型
彩色空间转换函数支持8位无符号,16位无符号,和32位浮点类型。
各个函数的支持类型的子集根据实际应用而设定并且可以根据用户需求在以后来扩展
输入数组和输出数组
很多opencv函数能够处理2维或多维数值数组,通常,这些函数以cpp:class:Mat作为参数,但是在一些场合,用std::vector(如点集)或Matx(如3X3单应矩阵?)要更为方便一些,为了避免API的重复,特殊的“代理”类被引入,由InputArray派生的OutputArray是用来为函数指定一个输出数组。通常,你需要关心这些中间类型(但你不需要明确申明这些类型的变量):这些都是会自动完成任务的。你可以假设除了InputArray/OutputArray,你总可以用Mat, std::vector, Matx, Vec or Scalar。当一个函数有一个可选择的输入或者输出数组时,而你又不必或者不想定义该数组,你可以传入cv::noArray()。
错误处理
opencv利用异常来触发关键错误,当输入数据是正确的类型并且数据在指定范围内,但是算法由于某些原因没有成功,函数会返回特定的错误代码(通常,是一个布尔变量)
异常可以通过cv::Exception类来实例化,cv::Exception是由std::exception派生的,所以它很容易被标准C++库组件处理。
try { ... // call OpenCV } catch( cv::Exception& e ) { const char* err_msg = e.what(); std::cout <br> <br> <span>多线程和重入</span> <p>当前版本的OPENCV是完全支持重入的,也就是说,同样的函数,同样的类实例的常数方法,或者同样的不同类实例的非常数方法可以被不同的线程调用,当然,同样的cv::Mat也可以在不同的线程中调用,因为引用计数器的操作是基于架构的原子指令</p>

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











특정 코드 예제가 필요한 OpenCV 튜토리얼을 쉽게 설치하려면 pip 명령을 사용하세요. OpenCV(OpenSource 컴퓨터 비전 라이브러리)는 개발자가 이미지를 빠르게 구축하는 데 도움이 되는 수많은 컴퓨터 비전 알고리즘과 기능을 포함하고 있습니다. 및 비디오 처리 관련 애플리케이션. OpenCV를 사용하기 전에 먼저 OpenCV를 설치해야 합니다. 다행스럽게도 Python은 타사 라이브러리를 관리할 수 있는 강력한 도구인 pip를 제공합니다.

OpenCV는 컴퓨터 비전 및 이미지 처리를 위한 오픈 소스 라이브러리로, 기계 학습, 이미지 인식, 비디오 처리 및 기타 분야에서 널리 사용됩니다. OpenCV를 사용하여 개발할 때 프로그램을 더 효과적으로 디버깅하고 실행하기 위해 많은 개발자는 강력한 Python 통합 개발 환경인 PyCharm을 선택합니다. 이 문서에서는 PyCharm 사용자에게 특정 코드 예제와 함께 OpenCV 설치 튜토리얼을 제공합니다. 1단계: Python 설치 먼저 Python이 설치되어 있는지 확인하세요.

ORM(객체 관계형 매핑) 프레임워크는 Python 개발에서 중요한 역할을 하며, 객체와 관계형 데이터베이스 사이에 브리지를 구축하여 데이터 액세스 및 관리를 단순화합니다. 다양한 ORM 프레임워크의 성능을 평가하기 위해 이 기사에서는 다음과 같은 널리 사용되는 프레임워크를 벤치마킹합니다. sqlAlchemyPeeweeDjangoORMPonyORMTortoiseORM 테스트 방법 벤치마크에서는 100만 개의 레코드가 포함된 SQLite 데이터베이스를 사용합니다. 테스트는 데이터베이스에서 다음 작업을 수행했습니다. 삽입: 테이블에 10,000개의 새 레코드를 삽입합니다. 읽기: 테이블의 모든 레코드를 읽습니다. 업데이트: 테이블의 모든 레코드에 대해 단일 필드를 업데이트합니다. 삭제: 테이블의 모든 레코드를 삭제합니다. 각 작업

JavaOpenCV 라이브러리의 org.opencv.imgproc 패키지에는 입력 이미지를 처리하는 다양한 방법을 제공하는 Imgproc라는 클래스가 포함되어 있습니다. 이미지에 기하학적 모양을 그리는 일련의 방법을 제공합니다. 화살표 선을 그리려면 이 클래스의 arrowedLine() 메서드를 호출해야 합니다. 이 메서드는 다음 매개 변수를 허용합니다. 선을 그릴 이미지를 나타내는 Mat 개체. 선 사이의 두 점을 나타내는 Point 개체입니다. 선 색상을 나타내는 Scalar 객체입니다. (BGR) 선 두께를 나타내는 정수입니다(기본값: 1). 예 importorg.opencv.core.Core;importo

ORM(객체 관계형 매핑)은 개발자가 SQL 쿼리를 직접 작성하지 않고도 객체 프로그래밍 언어를 사용하여 데이터베이스를 조작할 수 있도록 하는 프로그래밍 기술입니다. Python의 ORM 도구(예: SQLAlchemy, Peewee 및 DjangoORM)는 빅 데이터 프로젝트의 데이터베이스 상호 작용을 단순화합니다. 장점 코드 단순성: ORM을 사용하면 긴 SQL 쿼리를 작성할 필요가 없으므로 코드 단순성과 가독성이 향상됩니다. 데이터 추상화: ORM은 데이터베이스 구현 세부 사항에서 애플리케이션 코드를 분리하여 유연성을 향상시키는 추상화 계층을 제공합니다. 성능 최적화: ORM은 캐싱 및 일괄 작업을 사용하여 데이터베이스 쿼리를 최적화함으로써 성능을 향상시키는 경우가 많습니다. 이식성: ORM을 통해 개발자는 다음을 수행할 수 있습니다.

PyCharm은 JetBrains에서 개발한 강력한 Python 통합 개발 환경(IDE)으로 Python 개발자가 코드를 작성하고, 프로그램을 디버그하고, 프로젝트를 관리하는 데 도움이 되는 다양한 기능과 도구를 제공합니다. PyCharm에서 강력한 컴퓨터 비전 라이브러리인 OpenCV를 사용하면 이미지 처리, 비디오 처리 및 기타 작업을 쉽게 수행할 수 있습니다. 이 문서에서는 PyCharm에서 OpenCV를 설치 및 구성하는 단계를 자세히 설명하고 특정 코드 예제를 제공합니다. 1.안

Java 디자인 패턴 이해: 일반적으로 사용되는 7가지 디자인 패턴에 대한 소개, 특정 코드 예제가 필요합니다. Java 디자인 패턴은 널리 수용되는 일련의 디자인 아이디어와 행동 강령을 제공합니다. 디자인 패턴은 코드 구조를 더 잘 구성하고 계획하는 데 도움이 되므로 코드의 유지 관리, 읽기 및 확장성이 향상됩니다. 이 글에서는 Java에서 일반적으로 사용되는 7가지 디자인 패턴을 소개하고 해당 코드 예제를 제공합니다. 싱글톤 패트

Hough 선 변환을 사용하여 주어진 이미지에서 직선을 감지할 수 있습니다. OpenCV에는 두 가지 허프 라인 변환 방법, 즉 표준 허프 라인 변환과 확률적 허프 라인 변환이 있습니다. Imgproc 클래스의 HoughLines() 메서드를 사용하여 표준 거친 선 변환을 적용할 수 있습니다. 이 메서드는 소스 이미지를 나타내는 두 개의 Mat 객체와 선 매개변수(r, Φ)를 저장하는 벡터라는 매개변수를 허용합니다. 매개변수 r(픽셀) 및 Φ(라디안)의 해상도를 나타내는 두 개의 이중 변수입니다. 선을 "감지"하는 데 필요한 최소 교차점 수를 나타내는 정수입니다. Imgproc 클래스의 HoughLinesP()를 사용할 수 있습니다.
