当前位置:   article > 正文

opencv基础篇 ——(一)简介_opencv 是什么

opencv 是什么

opencv基础篇 ——(一)简介

OpenCV(Open Source Computer Vision Library)是一个开源的跨平台计算机视觉库,它提供了丰富的图像处理和计算机视觉功能,涵盖了从简单的图像处理操作到复杂的计算机视觉算法的实现。

重要信息

源码地址:opencv
官网地址:官网
官方文档:官方文档
官方教程:官方教程
扩展模块源码:opencv_contrib

特性和功能

  • 图像处理: 包括图像加载、保存、显示、剪裁、缩放、旋转等基本操作。
  • 计算机视觉: 提供了大量的计算机视觉算法,如特征检测、目标识别、目标跟踪、摄像头标定等。
  • 机器学习支持: OpenCV与机器学习库(如MLPack、Scikit-Learn)结合,可实现各种机器学习任务,如分类、回归、聚类等。
  • 深度学习集成: 支持使用深度学习框架(如TensorFlow、PyTorch)进行图像识别、目标检测等任务。
  • 平台支持: 兼容多个平台,包括Windows、Linux、macOS、Android等。
  • 语言支持: 提供C++、Python、Java等多种语言的接口,方便不同语言的开发者使用。

功能模块

OpenCV 是一个功能强大的开源计算机视觉库,提供了丰富的功能模块,用于图像处理、计算机视觉、深度学习等任务。以下是一些 OpenCV 中常用的功能模块:

  • Core 模块:

      提供了基本的数据结构、算法和函数,是其他模块的基础。包括图像处理、数组操作、数学运算等功能。
    
    • 1
  • Imgproc 模块:

      提供了图像处理的各种功能,如滤波、形态学操作、边缘检测、直方图等。
    
    • 1
  • Video 模块:

      提供了视频处理相关的功能,包括视频捕获、视频编解码、光流估计、帧间差分等。
    
    • 1
  • HighGui 模块:

      提供了图形用户界面相关的功能,包括窗口管理、鼠标和键盘事件处理等。
    
    • 1
  • Features2D 模块:

      提供了特征检测和描述子匹配的功能,包括 SIFT、SURF、ORB 等算法。
    
    • 1
  • Objdetect 模块:

      提供了目标检测和分类的功能,包括 Haar 特征分类器、HOG+SVM 等算法。
    
    • 1
  • Calib3d 模块:

      提供了相机标定、立体视觉和三维重建的功能,包括相机校正、立体匹配等算法。
    
    • 1
  • Dnn 模块:

      提供了深度学习模型的加载、推理和微调功能,支持 TensorFlow、PyTorch、Caffe 等框架。
    
    • 1
  • ML 模块:

      提供了机器学习相关的功能,包括支持向量机、K最近邻、决策树等算法。
    
    • 1
  • Flann 模块:

      提供了快速最近邻搜索的功能,用于高效的特征匹配和检索。
    
    • 1
  • Photo 模块:

      提供了图像修复、HDR合成、风格迁移等高级图像处理功能。
    
    • 1
  • Stitching 模块:

      提供了全景图像拼接的功能,可以将多幅重叠图像拼接成全景图像。
      这些功能模块覆盖了图像处理、计算机视觉、深度学习、机器学习等多个领域,使得 OpenCV 成为一个强大且多用途的计算机视觉库。
    
    • 1
    • 2

常用函数

1. 图像 I/O:

  • cv::imread:读取图像文件。
  • cv::imwrite:保存图像到文件。
  • cv::imshow:显示图像窗口。
  • cv::waitKey:等待键盘输入。

2. 图像处理:

  • 图像转换:
    • cv::cvtColor:颜色空间转换。
    • cv::resize:图像缩放。
    • cv::flip:图像翻转。
  • 图像增强:
    • cv::threshold:图像二值化。
    • cv::equalizeHist:直方图均衡化。
    • cv::GaussianBlur:高斯模糊。
  • 图像几何变换:
    • cv::warpAffine:仿射变换。
    • cv::warpPerspective:透视变换。
      3. 图像特征:
  • 特征检测:
    • cv::SIFT:尺度不变特征变换。
    • cv::SURF:加速稳健特征。
    • cv::ORB:Oriented FAST and Rotated BRIEF。
  • 特征匹配:
    • cv::matchTemplate:模板匹配。
    • cv::BFMatcher:暴力特征匹配器。
      4. 图像分割:
  • cv::threshold:阈值分割。
  • cv::findContours:查找图像轮廓。
  • cv::grabCut:GrabCut 图像分割算法。

5. 目标检测与跟踪:

  • 目标检测:
    • cv::CascadeClassifier:级联分类器(用于人脸检测等)。
    • cv::dnn::readNet:加载深度学习模型进行目标检测。
  • 目标跟踪:
    • cv::Tracker:目标跟踪器(如 KCF、MIL、CSRT 等)。
      6. 摄像头与视频处理:
  • cv::VideoCapture:打开摄像头或视频文件。
  • cv::VideoWriter:视频写入器。
  • 视频处理函数:如帧读取、帧写入、视频流处理等。

7. 深度学习集成:
* cv::dnn::readNet:加载深度学习模型。
* cv::dnn::Net::forward:模型推理前向传播。
* 深度学习模型支持:如 TensorFlow、PyTorch、Caffe 等。
8. 机器学习与统计:
* cv::ml::SVM:支持向量机。
* cv::ml::KNearest:K最近邻分类器。
* cv::ml::EM:期望最大化算法。
9. 其他模块:
* 形状分析: cv::moments、cv::contourArea 等。
* 图像绘制: cv::rectangle、cv::circle、cv::line 等。
* 图像处理工具: cv::getStructuringElement、cv::filter2D 等。

了解cv::Mat

  • cv::Mat 中的数据以连续的方式存储在内存中。对于单通道图像,数据是按行存储的;对于多通道图像,每个通道的数据是连续存储的,但通道之间可能不连续。
  • cv::Mat 中的数据类型可以是整型、浮点型或者其他自定义类型,如 CV_8UC1 表示8位无符号单通道图像,CV_32FC3 表示32位浮点型三通道图像。

cv::Mat 是表示图像或任意多维数组的基本数据结构。以下是一些 cv::Mat 常用的操作:

  • 创建 cv::Mat 对象:

    • 从已有数据创建:使用构造函数或者 cv::Mat::create 函数。
    • 从图像文件加载:使用 cv::imread 函数加载图像文件。
  • 访问像素值:

    • 使用 at 方法:mat.at(row, col),例如 mat.at(i, j)。
    • 使用指针访问:mat.ptr(row)[col],例如 mat.ptr(i)[j]。
  • 图像属性:

    • rows:图像的行数。
    • cols:图像的列数。
    • size:图像的大小。
    • type:图像的数据类型。
    • channels:图像的通道数。
  • 数据拷贝:

    • 深拷贝:cv::Mat::clone 或者 cv::Mat::copyTo。
    • 浅拷贝:直接赋值操作符 =。
  • 图像操作:

    • 图像裁剪:使用 cv::Rect 创建感兴趣区域(ROI)。
    • 图像拼接:使用 cv::vconcat 或者 cv::hconcat 进行垂直或水平拼接。
    • 图像融合:使用 cv::addWeighted 进行图像加权融合。
  • 图像类型转换:

    • 转换颜色空间:使用 cv::cvtColor 进行颜色空间转换。
    • 转换数据类型:使用 cv::Mat::convertTo 进行数据类型转换。
  • 图像操作:

    • 图像缩放:使用 cv::resize 进行图像大小调整。
    • 图像旋转:使用 cv::warpAffine 进行仿射变换。
    • 图像平移:使用 cv::warpAffine 进行平移变换。
  • 图像统计:

    • 计算均值和方差:使用 cv::meanStdDev 计算图像的均值和标准差。
    • 计算直方图:使用 cv::calcHist 计算图像的直方图。
  • 图像通道分离与合并:

    • 通道分离:使用 cv::split 将多通道图像分离成单通道图像。
    • 通道合并:使用 cv::merge 将多个单通道图像合并成多通道图像。
  • 图像显示与保存:

    • 图像显示:使用 cv::imshow 显示图像。
    • 图像保存:使用 cv::imwrite 保存图像到文件。

示例

图片处理

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main() {
    Mat image = imread("image.jpg", IMREAD_GRAYSCALE);
    if (image.empty()) {
        cout << "无法读取图像文件!" << endl;
        return -1;
    }

    Mat binary;
    threshold(image, binary, 128, 255, THRESH_BINARY);

    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;

    // 查找轮廓
    findContours(binary, contours, hierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE);

    // 绘制轮廓
    Mat result = Mat::zeros(image.size(), CV_8UC3);
    drawContours(result, contours, -1, Scalar(0, 255, 0), 2);

    // 显示结果
    imshow("Contours", result);
    waitKey(0);

    return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

视频处理

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
	cv::VideoCapture cap;   //声明相机捕获对象
	cap.set(cv::CAP_PROP_FOURCC, cv::VideoWriter::fourcc('M', 'J', 'P', 'G'));
	cap.set(cv::CAP_PROP_FRAME_WIDTH, 640); //图像的宽,需要相机支持此宽
	cap.set(cv::CAP_PROP_FRAME_HEIGHT, 480); //图像的高,需要相机支持此高,图像分辨率640×480
	int deviceID = 0; //相机设备号
	cap.open(deviceID); //打开相机,如果打开视频文件,直接输入视频文件路径和文件名
	if (!cap.isOpened()) //判断相机是否打开
	{
		std::cerr << "ERROR!!Unable to open camera\n";
		return -1;
	}
	cv::Mat img;
	while (true)
	{
		cap >> img; //以流形式捕获图像
		cv::namedWindow("example", 1); //创建一个窗口用于显示图像,1代表窗口适应图像的分辨率进行拉伸。
		if (img.empty() == false) //图像不为空则显示图像
		{
			cv::imshow("example", img);
		}
		int  key = cv::waitKey(30); //等待30ms
		if (key == int('q')) //按下q退出
		{
			break;
		}
	}
	cap.release(); //释放相机捕获对象
	cv::destroyAllWindows(); //关闭所有窗口
	return 0;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/673170
推荐阅读
相关标签
  

闽ICP备14008679号