携手创作,共同生长!这是我参与「日新计划 10 月更文应战」的第 12 天 点击查看活动详情

欢迎重视我的公众号 [极智视界],获取我的更多笔记共享

  大家好,我是极智视界,本文介绍一下 opencv 你真的会用吗?

  OpenCV 是一个实时优化的核算机视觉库,它还支撑机器学习 (ML) 和 人工智能 (AI) 的模型履行。许多深度学习领域的人在用 opencv 往往只会用一些它的 图画预处理 如 读图 (这构建了图画处理的数据结构)、resize 等基础操作,而这往往会让大家忽略一点:opencv 是个功用非常强壮、完全的核算机视觉库,你平时在用的或许仅仅它功用的一小部分而已。这篇文章,我们一起来看看 opencv 有哪些常用的方面。

1 opencv 做图画预处理

  在做视觉图画处理的时分,第一个环节就是要加载图画,不管你的数据来历是视频流仍是单张图,最基础的处理单元仍是图片,而 opencv 用 cv::Mat 根本图画数据结构来界说了这一标准。根据 cv::Mat 后,我们就能够运用许多 opencv 提供的图画处理接口,如 cv::resize (包含了丰富的插值算法完成)cv::cvtColor (包含了丰富的通道转化完成) 等,这样一套下来根本足够满意我们的图画预处理了。除了这些根本的图画处理接口,还有像边际检测 (如 cv::Canny)、图画图形学操作 (如 cv::dilatecv::erode)等。

#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
void main() {
  std::string path = "data/test.png";
  cv::Mat img = cv::imread(path);
  cv::Mat imgGray, imgBlur, imgCanny, imgDil, imgErode;
  // 图画处理:将照片转化为灰度
  cv::cvtColor(img, imgGray, cv::COLOR_BGR2GRAY);
  // 图画处理:高斯含糊
  cv::GaussianBlur(imgGray, imgBlur, cv::Size(3, 3), 3, 0);
  // 边际检测:Canny边际检测器  一般在运用Canny边际检测器之前会做一些含糊处理
  cv::Canny(imgBlur, imgCanny, 25, 75);
  // 创立一个能够运用胀大的内核
  cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
  // 图形学:图画胀大
  cv::dilate(imgCanny, imgDil, kernel);
  // 图形学:图画侵蚀
  cv::erode(imgDil, imgErode, kernel);
}

极智AI | opencv 你真的会用吗?

2 opencv 做模型推理

  你必定不要忘了,opencv 还能够做模型推理,并且功用也是越来越全面。而这一切都要源于 opencv 的 dnn 模块。我们拿最新的 opencv-4.6 来看,先来看一下 cv::dnn::Backend 后端cv::dnn::Target 方针渠道 ,你就知道为啥说它 全面 了。

极智AI | opencv 你真的会用吗?
极智AI | opencv 你真的会用吗?

  能够看到它后端的优化办法乃至还包含了编译优化HALIDE,方针渠道也是非常的丰富,不仅仅常见的 CPU、CUDA,还有 OPENCL、FPGA、VULKAN 等。

  关于深度学习模型的推理,opencv 库里封装了图画预处理函数:cv::dnn::blobFromImage,在里面能够直接做图画标准化、归一化的操作,免得再自己写好几句来完成这些功用,这就很类似 pytorch 中加载图画数据。opencv 当然也支撑直接加载从成熟的练习结构出来的模型进行推理,支撑的比较好的结构有:caffe、darknet、tensorflow、onnx。当然你或许还在用其他的一些练习结构,如 pytorch、mxnet,乃至国产的练习结构如pp、mindspore,这个时分由于有了 onnx,就会给你无尽的幻想。

3 opencv 做相机标定

  做工业视觉 或 其他场景一些视觉丈量、定位领域的小伙伴关于相机标定必定不会陌生吧。由于涉及到精度、乃至是高精度;二维、设置三维,相机标定必定不是一个简略的事情,它不仅需求核算图画国际和真实国际的仿射改换(平面)/透射改换(三维),还需求解畸变。这中间涉及非常复杂的高等数学、矩阵论的推理核算。好在人们聪明,发明了 标定板 这个工具来对相机进行标定,常见的有棋盘格标定(张正友标定法)、九点标定等。这大大简化了映射变化的核算,而强壮的 opencv 也对采用 标定板 进行相机标定的接口进行了完成,包含找圆(九点标定需求)、找角点(棋盘格标定需求)、核算映射矩阵等。

极智AI | opencv 你真的会用吗?

4 opencv 做人脸剖析

  上述讲的 opencv 做图画预处理、做模型推理、做相机标定主要是针对某个模块的运用,opencv 还有个强壮的地方在 运用它能够快速构建运用。拿人脸检测来说,运用 opencv,你或许只需求几行代码就能够构建一个可用的人脸检测运用程序:

import cv2
import numpy as np
import cv2
cap = cv2.VideoCapture(0) # 翻开默许摄像头
while 1:
 ret, image = cap.read() # 读取摄像头
 # 加载分类分类器模型
 faceCascade=cv2.CascadeClassifier("opencv\haarcascade_frontalface_default.xml")
 gray=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
​
 faces=faceCascade.detectMultiScale(
                   gray,
                   scaleFactor=1.15,
                   minNeighbors=5,
                   minSize=(5,5)
                   )
  # 逐个标示人脸
 for (x,y,w,h) in faces:
   cv2.rectangle(image, (x,y), (x+w,y+h), (0,255,0),2)
  
 if cv2.waitKey(1) == 27: # 按下esc停止
    break
 cv2.imshow("dect", image)
 cv2.waitKey()
 cv2.destroyAllWindows() 

  这看起来应该非常便利,除了人脸检测,运用 opencv 还能够快速构建人脸识别运用,你能够自行尝试。

5 opencv 做三方库

  在实际工程中,我们经常把 opencv 作为 3rdparty 来用,这仍是源于它能够便利的做图画加载/保存 以及 图画预处理。或许会有这么一个场景:用 opencv 加载图画,做图画预处理,然后把 cv::Mat 转化为 float* 送入后续操作;乃至是 只用 opencv 加载图画,在 cv::Mat 转化到 float* 的过程中同时就把图画预处理给做了。上面的这一波操作,需求你非常清楚 cv::Mat 中的像素排布 (包含单通道、多通道的像素排布),由于你需求用指针对像素进行操作。

// 读图
cv::Mat source = cv::imread("data/test.png");
​
// 接收 float* 数据的变量
float *data = new float[batch * 3 * imgW * imgH];
​
int mat_data_id = 0;
// 标准化
for (int i = 0; i < imgH; i++)
{
 const uchar* current = source.ptr<uchar>(i);
 for (int j = 0; j < imgW; j++)
  {
  data[n * 3 * imgW * imgH + mat_data_id] = (current[3 * j + 0] / 255.0 - 0.48) / 0.27;   // range by channel
  data[n * 3 * imgW * imgH + imgW * imgH + mat_data_id] = (current[3 * j + 1] / 255.0 - 0.46) / 0.26;
  data[n * 3 * imgW * imgH + 2 * imgW * imgH + mat_data_id] = (current[3 * j + 2] / 255.0 - 0.41) / 0.28;
  mat_data_id++;
  }
}
​
// data 接收到 float* 数据后,再进行后续操作
...

  …… (…完毕不了,以上还仅仅部分功用)

  当然,看文章不如多举动,你能够直接去 opencv 官网下载相应的库操作一波 (当然,官方下载比较慢,能够选择点我这里下载,不限速)。

  • opencv4.5.2-win10&win11 安装包:download.csdn.net/download/we…;
  • opencv-4.5.2-source源码:download.csdn.net/download/we…;
  • opencv3.4.6-win10&win11 安装包:download.csdn.net/download/we…;
  • opencv-3.4.6-source源码:download.csdn.net/download/we…

  好了,以上共享了 opencv 你真的会用吗?希望我的共享能对你的学习有一点帮助。


 【公众号传送】

《极智AI | opencv 你真的会用吗?》


极智AI | opencv 你真的会用吗?