1-opencv基本介绍

    opencv是开源的图像算法库,包含几百种视觉相关的图像算法,Opencv2.x API是在C++上测试通过的api,并不像1.x是在C上测试通过的。

    opencv包含以下几个模块:

1)Core functionality (core) :基础模块,主要定义包含数据基本存储单元的Mat等基本的数据类型,以及在其他模块中调用的基本函数

2)Image Processing (imgproc) :图像处理模块,包含线性、非线性的图像滤波算法、图像几何变换(如缩放、仿射变换、透射变换、查表重组等)、颜色空间转换、直方图等。

3)Video Analysis (video):视频分析模块:包含运动预估、背景提取以及目标跟踪算法等。

4)Camera Calibration and 3D Reconstruction (calib3d):基本的多目几何算法,单独的和立体相机校准、目标姿态估计、立体匹配算法以及三维重建。

5)2D Features Framework (features2d) :静态特征检测器、描述子以及特征匹配等。

6)Object Detection (objdetect):对于预定义的目标或者实例(如人脸、眼睛、下巴、人、汽车等)进行检测。

7)High-level GUI (highgui) :一个方便好用的UI接口。

8)Video I/O (videoio):视频处理接口以及视频编解码相关。

    还有一些如dnn深度学习相关、ml机器学习相关、flann多维空间特征检测和匹配、Images stitching图像拼接相关等模块。下面先介绍一些opencv最基础的使用方法。

API Concepts

    cv命名空间

    opencv所有相关的类、函数都是放置在cv命名空间下面,因此,要想在自己代码中使用opencv相关函数,必须使用cv::或者在cpp最开始定义命名空间using namespace cv;如下:

#include "opencv2/core.hpp"

...

cv::Mat H = cv::findHomography(points1, points2, cv::RANSAC, 5);

...

或者:

#include "opencv2/core.hpp"

using namespace cv;

...

Mat H = findHomography(points1, points2, RANSAC, 5 );

...

如果opencv目前或者将来有一些函数与STL或者其他模块冲突,在调用冲突函数时,加上其命名空间即可,如下:

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,cv::Mat等数据结构自己包含有析构函数,当被需要的时候(变量不再被使用的时候),自行释放之前分配的资源。这也意味着,在Mat类型中,析构函数并不是一直在释放内存,它要考虑数据共享机制。如果一个Mat型变量使用结束,也就是没有其他变量再与此变量相关,或者函数运行结束了,析构函数才去释放此Mat型变量占用的资源。

    如果拷贝一个Mat,(b = a.copy()),数据并没有真正进行拷贝,只不过增加了一个新的变量,新变量仍然指向此位置,如果对a/b任何一个操作,另外一个也随之变化。但是Mat::clone,克隆的话,就是重新分配空间,定义一个全新的变量了(完全拷贝,深复制,两个变量不再关联)。例子如下:

// 创建一个8M大小的矩阵

Mat A(1000, 1000, CV_64F);

// 为此矩阵创建一个新的头信息,B与A相同,改变一个矩阵内部值,另外一个也随之变化;

Mat B = A;

// 为B矩阵的第三行创建一个头信息,此处并不进行数据拷贝

Mat C = B.row(3);

// clone是创建新的完全独立的矩阵,两个不相关

Mat D = B.clone();

//把B的第五行拷贝到C里面,也就是把A的第五行拷贝到A的第三行 

B.row(5).copyTo(C);

// 让A与D共享数据,修改之后,A同样与B和C静态关联

A = D;

// 释放B矩阵的内存信息,但是修改后的A仍然与C相关联,尽管C只是指向A的单独的一行,

B.release();

// 最终,将C自己进行深拷贝,就不再与A关联,此时A被完全释放

C = C.clone();

    opencv可以通过类似于python的try...except....机制使用try ...catch...捕捉异常

try

{

... // call OpenCV

}

catch (const cv::Exception& e)

{

const char* err_msg = e.what();

std::cout << "exception caught: " << err_msg << std::endl;

}

通过CV_Assert(condition)判断输入条件是否准确,异常则直接卡死返回。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要进行相机标定的目的是为了去掉相机透镜畸变,使拍摄的图像更加准确,对于使用opencv库的python用户来讲,相机标定也是一项常规操作。以下是python-opencv相机标定的教程: 1. 收集标定图片:准备至少10到20张不同角度和位置的图片,要保证图片中有棋盘格子等模板。 2. 提取角点特征:用cv2.findChessboardCorners()函数提取棋盘格子的角点,这里用到的是cv2自带的提取工具。 3. 标定镜头:用cv2.calibrateCamera()函数对相机进行标定,得出相机内参矩阵等相关参数。 4. 存储标定结果: 使用cv2.FileStorage()函数存储标定参数。 5. 测试标定结果:使用cv2.undistort()函数果进行畸变校正,并观察校正后的图像是否有改善。 6. 应用标定结果:将标定结果应用到实际项目中,在程序中调用标定参数可以有效降低图像畸变,提高图像质量。 以上是python-opencv相机标定的教程,如果有需要的话,还可以使用均匀灰度图像等其他方式进行标定。通常情况下,一次标定的结果可以使用长时间,从而提高整个项目的精确度。 ### 回答2: Python-OpenCV相机标定教程是小型项目的标准。 在机器视觉和计算机视觉中,相机标定非常重要,这是获取全面、准确的数据的基础。相机标定的目的是为了减少照相机视角失真,提高拍摄到的图像质量,从而更好地支持照相机的图像处理。它的主要目的是矫正图像中的畸变并确定相机的内参和外参。 Python-OpenCV相机标定教程可以在Python编程语言中使用OpenCVPython库实现。这个过程包括多个步骤,如获取棋盘格角点、标定相机、计算相机的投影矩阵等。 在相机标定过程中,需要拍摄多张棋盘格图像。首先,必须定义棋盘格行列数量,然后手动测量棋盘格方格大小并加载图像到OpenCVPython中。接下来,寻找图像中棋盘格的角点,这些角点可以被处理以消除任何镜头失真。使用这些图像来标定相机并计算相机的投影矩阵。最后,保存相机内参和外参以对未来的图像应用重新计算。 相机标定的作用是消除由透视等导致的图像质量降低,从而使图像更清晰、更准确。Python-OpenCV相机标定教程为开发者提供了实现相机标定的基础,使他们可以快速构建照相机内参与外参算法并为数据处理提供基础。 ### 回答3: Python-OpenCV相机标定教程 OpenCV是一种非常流行的计算机视觉库,具有许多强大的功能,包括相机标定。相机标定是将相机的内部参数和畸变参数计算出来,以便更好地将2D图像转换为3D场景。在此教程中,我们将介绍使用Python-OpenCV库进行相机标定的步骤。 第一步:获取棋盘格图像 在进行相机标定之前,需要获取一些棋盘格图像。为了获得尽可能准确的结果,您需要将棋盘格图像从不同的角度和位置拍摄,并确保棋盘格图像足够清晰。我们建议至少拍摄10张不同的图像。 第二步:检测棋盘格角点 使用OpenCV中的函数cv2.findChessboardCorners()可以检测棋盘角点。它需要棋盘的大小和图像。如果检测到角点,函数将返回True,并将角点位置存储在一个数组中。 第三步:计算相机内部参数和畸变参数 为了计算相机的内部参数和畸变参数,需要使用OpenCV中的函数cv2.calibrateCamera()。这个函数接受一个由棋盘格图像和对应的角点位置组成的列表,并返回摄像机矩阵,畸变系数和旋转矩阵。 第四步:评估相机标定结果 在评估相机标定结果时,您需要计算误差,这可以通过一个简单的公式完成。误差是指每个棋盘格角点的图像坐标和标准(真实)坐标之间的平均距离。您还可以使用OpenCV可视化函数来显示标定结果。 总结 这就是使用Python-OpenCV进行相机标定的基本步骤。相机标定是一个基本任务,但是它对于实现更复杂的计算机视觉任务非常重要。标定成功后,您可以更准确地进行2D到3D坐标的变换,从而实现更准确的跟踪和测量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值