OpenCV2马拉松第1圈——纵观全局

本文深入探讨了OpenCV2的模块和核心概念,包括core、imgproc、video、calib3d、features2D和objdetect等。讲解了不同数据类型和颜色空间转换,并提到了人脸检测和机器学习算法的应用限制。同时,文章强调了OpenCV从C版本到C++版本的变化,以及在计算机视觉领域的广泛使用。
摘要由CSDN通过智能技术生成

前话

我会结合计算机视觉算法与应用,冈萨雷斯图像处理,以及CVPR,ICCV等论文深入原理,不仅会用OpenCV,还要懂原理。

Version1和Version2的主要差别

OpenCV2和OpenCV1的一个主要差别就是1是C的版本,2是C++的版本


简要介绍


OpenCV有很多的模块

  • core,定义了许多数据结构和基本的函数
  • imgproc,顾名思义就是处理图片的模块,包括线性和非线性滤波器,图形几何变换,颜色空间变换,直方图
  • video,包括运动估计,背景消除,物体跟踪
  • calib3d,摄像机标定,姿态估计,3D重建
  • features2D,用于特征的检测
  • objdetect,可方便实现人脸识别,眼睛,人,车也可以,已经训练过了
  • highgui,很方便的图像捕获接口
  • gpu,跟GPU加速有关
  • 等等
一些要了解的常识
OpenCV所有的东西都在cv这个namespace下面
所在,我们在调用的时候可以这样
#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 );

当你的命名空间有std,cv等等大于1个的时候,就有可能导致冲突,比如log函数,这时候就必须要指定了
Mat a(100, 100, CV_32F);
randu(a, Scalar::all(1), Scalar::all(std::rand()));
cv::log(a, a);
a /= std::log(2.);

自动内存管理
在使用version1的时候,我们都要free(image)
在version2里面,所有的类都有解析函数,不需要你手动去管理了
// 创建了1000*1000,每个像素点是64位浮点数
Mat A(1000, 1000, CV_64F);

// B和A共享像素数据,这个操作是立即的,不需要复制像素点
Mat B = A;
// 跟上面一样,只是共享了row3
Mat C = B.row(3);
// 现在是独立的复制了
Mat D = B.clone();
// 把B的第5行复制给C, 其实就是把A的第5行复制给A的第3行
B.row(5).copyTo(C);
// A共享了D的数据;
A = D;

// C仍然指向修改后的A的数据
B.release();

// 这时候,A原来的数据就消失了
C = C.clone();

当你创建属于自己的数据结构,但是又没有自动内存管理怎么办?
OpenCV有自己的智能指针
Ptr<T> ptr = new T(...);

OpenCV大多数时候会自动为输出矩阵分配内存
#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
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值