博客
关于我
OpenCV入门教程(非常详细)从零基础入门到精通,看完这一篇就够了
阅读量:791 次
发布时间:2023-02-23

本文共 6907 字,大约阅读时间需要 23 分钟。

OpenCV基础入门【C++语言】

OpenCV(Open Computer Vision)是用于计算机视觉的开源库,提供了丰富的功能来处理图像和视频。以下是OpenCV的基础知识和常用功能的介绍。

从文件读取图片

在OpenCV中,imread函数用于从文件中读取图像。该函数支持多种图像格式,并返回一个Mat对象表示图像。如果读取失败,返回空矩阵(Mat::data==NULL)。需要注意的是,OpenCV默认图像格式为BGR(蓝、绿、红),与常见的RGB顺序不同。

示例代码

#include 
#include
#include
#include
using namespace cv;using namespace std;int main() { string path = "Resources/test.png"; Mat img = imread(path); imshow("Image", img); waitKey(0); return 0;}

说明

  • imread函数从指定文件读取图像。
  • imshow函数显示图像。
  • waitKey函数用于等待键盘输入,通常与imshow结合使用。

从文件读取视频

视频捕获需要使用VideoCapture类。可以从视频文件或摄像头捕获视频流。

示例代码

#include 
#include
#include
#include
using namespace cv;using namespace std;int main() { string path = "Resources/test_video.mp4"; VideoCapture cap(path); Mat img; while (true) { cap.read(img); imshow("Image", img); waitKey(1); } return 0;}

说明

  • VideoCapture构造函数初始化视频捕获。
  • read函数获取视频帧并存储在Mat对象中。
  • imshowwaitKey用于显示视频流。

读取摄像头

从摄像头设备读取图像可以使用同样的VideoCapture对象,指定设备索引为0。

示例代码

#include 
#include
#include
#include
using namespace cv;using namespace std;int main() { VideoCapture cap(0); Mat img; while (true) { cap.read(img); imshow("Image", img); waitKey(1); } return 0;}

调整和剪裁

图像调整

resize函数用于调整图像大小,支持不同的缩放方式。

示例代码

#include 
#include
#include
#include
using namespace cv;using namespace std;int main() { string path = "Resources/test.png"; Mat img = imread(path); Mat imgResize, imgCrop; cout << img.size() << endl; resize(img, imgResize, Size(), 0.5, 0.5); Rect roi(200, 100, 300, 300); imgCrop = img(roi); imshow("Image", img); imshow("ImageResieze", imgResize); imshow("ImageCrop", imgCrop); waitKey(0); return 0;}

说明

  • resize函数根据指定大小和比例调整图像。
  • roi表示图像的子矩形区域。

绘制形状和文字

OpenCV提供了多种绘图函数,包括圆、矩形、直线和文字。

示例代码

#include 
#include
#include
#include
using namespace cv;using namespace std;int main() { Mat img(512, 512, CV_8UC3, Scalar(255, 255, 255)); circle(img, Point(256, 256), 155, Scalar(0, 69, 255), FILLED); rectangle(img, Point(130, 226), Point(382, 286), Scalar(255, 255, 255), -1); line(img, Point(130, 296), Point(382, 296), Scalar(255, 255, 255), 2); putText(img, "SJN's Workshop", Point(137, 262), FONT_HERSHEY_DUPLEX, 0.95, Scalar(0, 69, 255), 2); imshow("Image", img); waitKey(0); return 0;}

说明

  • circle绘制圆形。
  • rectangle绘制矩形。
  • line绘制直线。
  • putText绘制文字。

透视变换

透视变换用于改变图像的投影。warpPerspective函数根据投影矩阵进行变换。

示例代码

#include 
#include
#include
#include
#include
using namespace cv;using namespace std;int main() { string path = "Resources/cards.jpg"; Mat img = imread(path); Point2f src[4] = {{529, 142}, {771, 190}, {405, 395}, {674, 457}}; Point2f dst[4] = {{0.0f, 0.0f}, {w, 0.0f}, {0.0f, h}, {w, h}}; matrix = getPerspectiveTransform(src, dst); warpPerspective(img, imgWarp, matrix, Point(w, h)); for (int i = 0; i < 4; i++) { circle(img, src[i], 10, Scalar(0, 0, 255), FILLED); } imshow("Image", img); imshow("ImageWarp", imgWarp); waitKey(0); return 0;}

说明

  • getPerspectiveTransform计算投影矩阵。
  • warpPerspective应用投影矩阵变换图像。

颜色检测

HSV颜色空间

OpenCV支持HSV颜色空间,便于颜色检测。cvtColor函数可以将RGB图像转换为HSV。

示例代码

#include 
#include
#include
#include
using namespace cv;using namespace std;int main() { string path = "Resources/lambo.png"; Mat img = imread(path); cvtColor(img, imgHSV, COLOR_BGR2HSV); namedWindow("Trackbars", (640, 200)); createTrackbar("Hue Min", "Trackbars", &hmin, 179); createTrackbar("Hue Max", "Trackbars", &hmax, 179); createTrackbar("Sat Min", "Trackbars", &smin, 255); createTrackbar("Sat Max", "Trackbars", &smax, 255); createTrackbar("Val Min", "Trackbars", &vmin, 255); createTrackbar("Val Max", "Trackbars", &vmax, 255); while (true) { Scalar lower(hmin, smin, vmin); Scalar upper(hmax, smax, vmax); inRange(imgHSV, lower, upper, mask); imshow("Image", img); imshow("Image HSV", imgHSV); imshow("Image Mask", mask); waitKey(1); } return 0;}

说明

  • cvtColor将图像转换为HSV颜色空间。
  • namedWindow创建窗口。
  • createTrackbar创建滑块控制颜色阈值。
  • inRange检测颜色在指定范围内的图像区域。

形状/轮廓检测

findContours函数

findContours函数用于检测图像中的轮廓。支持多种轮廓检索模式和近似方法。

示例代码

#include 
#include
#include
#include
using namespace cv;using namespace std;void getContours(Mat imgDil) { vector
> contours; vector
hierarchy; findContours(imgDil, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); vector
> conPoly(contours.size()); vector
boundRect(contours.size()); for (int i = 0; i < contours.size(); i++) { double area = contourArea(contours[i]); if (area > 1000) { double peri = arcLength(contours[i], true); approxPolyDP(contours[i], conPoly[i], 0.02 * peri, true); boundRect[i] = boundingRect(conPoly[i]); if (boundRect[i].width * boundRect[i].height > 0) { rectangle(img, boundRect[i].tl(), boundRect[i].br(), Scalar(0, 255, 0), 5); Point myPoint = Point(boundRect[i].x + boundRect[i].width / 2, boundRect[i].y); putText(img, "Box", myPoint, FONT_HERSHEY_PLAIN, 1, Scalar(0, 69, 255), 1); } } } return conPoly;}int main() { string path = "Resources/shapes.png"; Mat img = imread(path); Mat imgDil; dilate(img, imgDil, kernel); getContours(imgDil); imshow("Image", img); // 以下行可用于显示其他中间结果 // imshow("Image Dilation", imgDil); waitKey(0); return 0;}

说明

  • findContours检测轮廓。
  • contourArea计算轮廓面积。
  • arcLength计算曲线长度。
  • approxPolyDP近似多边形。
  • boundingRect计算轮廓的最小上边界矩形。

人脸检测

###CascadeClassifierCascadeClassifier用于面部检测。加载预训练的分类器后,能够检测人脸区域。

示例代码

#include 
#include
#include
#include
#include
using namespace cv;using namespace std;int main() { string path = "Resources/test.png"; Mat img = imread(path); CascadeClassifier faceCascade; faceCascade.load("Resources/haarcascade_frontalface_default.xml"); if (faceCascade.empty()) { cout << "XML file not loaded" << endl; } vector
faces; faceCascade.detectMultiScale(img, faces, 1.1, 10); for (int i = 0; i < faces.size(); i++) { rectangle(img, faces[i].tl(), faces[i].br(), Scalar(255, 0, 255), 3); } imshow("Image", img); waitKey(0); return 0;}

说明

  • CascadeClassifier加载面部检测分类器。
  • detectMultiScale检测多尺度面部区域。
  • rectangle绘制人脸区域。

项目实例

虚拟画家

选择颜色并在图像上绘制颜色框。

文档扫描

通过图像处理和透视变换实现文档扫描。

车牌检测

使用CascadeClassifier检测车牌区域。

题外话

计算机行业就业前景

  • 2023届高校毕业生就业率较高,但行业需求和薪资待遇也在上升。
  • 网络安全行业就业机会多,薪资待遇高,但人才短缺。

网络安全行业特点

  • 高薪和快速涨薪。
  • 大量职业发展机会。
  • 符号效应明显,经验增长带来更高回报。

学习建议

  • 学习网络安全基础知识和实战技能。
  • 参与开源项目或竞赛。
  • 关注行业动态和工具发展。

通过不断学习和实践,掌握OpenCV和网络安全技能,将助力职业发展!

转载地址:http://kgsfk.baihongyu.com/

你可能感兴趣的文章
opencv7-绘制形状和文字
查看>>
opencv8-图像模糊
查看>>
opencv9-膨胀和腐蚀
查看>>
OpenCV_ cv2.imshow()
查看>>
opencv_core.dir/objects.a(vs_version.rc.obj)‘ is incompatible with i386:x86-64 output
查看>>
opencv——图像缩放1(resize)
查看>>
opencv——最简单的视频读取
查看>>
Opencv——模块介绍
查看>>
OpenCV与AI深度学习 | 2024年AI初学者需要掌握的热门技能有哪些?
查看>>
OpenCV与AI深度学习 | CIB-SE-YOLOv8: 优化的YOLOv8, 用于施工现场的安全设备实时检测 !
查看>>
OpenCV与AI深度学习 | CoTracker3:用于卓越点跟踪的最新 AI 模型
查看>>
OpenCV与AI深度学习 | OpenCV中八种不同的目标追踪算法
查看>>
OpenCV与AI深度学习 | OpenCV图像拼接--Stitching detailed使用与参数介绍
查看>>
OpenCV与AI深度学习 | OpenCV如何读取仪表中的指针刻度
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(一) :直接拼接
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(三):基于特征匹配拼接
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(二) :基于模板匹配拼接
查看>>
OpenCV与AI深度学习 | OpenCV常用图像拼接方法(四):基于Stitcher类拼接
查看>>
OpenCV与AI深度学习 | OpenCV快速傅里叶变换(FFT)用于图像和视频流的模糊检测(建议收藏!)
查看>>
OpenCV与AI深度学习 | PaddleOCR 2.9 发布, 正式开源文本图像智能分析利器
查看>>