本文共 6907 字,大约阅读时间需要 23 分钟。
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对象中。imshow和waitKey用于显示视频流。从摄像头设备读取图像可以使用同样的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应用投影矩阵变换图像。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函数用于检测图像中的轮廓。支持多种轮廓检索模式和近似方法。
#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检测车牌区域。
通过不断学习和实践,掌握OpenCV和网络安全技能,将助力职业发展!
转载地址:http://kgsfk.baihongyu.com/