一、基础概念
1、OpenCV中的图像
OpenCV中的图像是以二维矩阵(Mat)的形式保存的,图像的每个像素点都有一个数值,代表该像素点的亮度值。对于彩色图像,同一位置有B、G、R三个通道的亮度值。一张宽为w,高为h的彩色图像可以表示为三维矩阵(Mat):B(w,h),G(w,h),R(w,h)。
// 读入并显示图像
#include
using namespace cv;
int main(void)
{
Mat img = imread("path/to/image.png"); // 读入图像
namedWindow("Display Image", WINDOW_AUTOSIZE ); // 创建一个GUI窗口
imshow("Display Image", img); // 在窗口中显示图像
waitKey(0); // 等待用户按下键盘
return 0;
}
2、图像处理
OpenCV提供了丰富的图像处理功能,比如:图像过滤、卷积、图像增强、图像变换、二值化、像素操作等。
// 图像灰度化
#include
using namespace cv;
int main(void)
{
Mat img = imread("path/to/image.png"); // 读入图像
Mat img_gray;
cvtColor(img, img_gray, COLOR_BGR2GRAY); // 灰度化
namedWindow("Display Image", WINDOW_AUTOSIZE ); // 创建一个GUI窗口
imshow("Display Image", img_gray); // 在窗口中显示图像
waitKey(0); // 等待用户按下键盘
return 0;
}
二、图像处理实战
1、图像滤波
通常情况下,图像中可能存在各种各样的噪声,比如高斯噪声、椒盐噪声等,这些噪声会导致图像质量下降,因此需要进行滤波处理。OpenCV中提供了多种图像滤波函数,比如高斯滤波、中值滤波、均值滤波等。
// 图像平滑处理(均值滤波)
#include
using namespace cv;
int main(void)
{
Mat img = imread("path/to/image.png"); // 读入图像
Mat img_blur;
blur(img, img_blur, Size(5, 5)); // 均值滤波
namedWindow("Display Image", WINDOW_AUTOSIZE ); // 创建一个GUI窗口
imshow("Display Image", img_blur); // 在窗口中显示图像
waitKey(0); // 等待用户按下键盘
return 0;
}
2、图像边缘检测
图像边缘检测是图像处理中一个非常重要的问题,它可以用来寻找图像的边缘、轮廓等特殊部分,是很多图像处理算法的前置步骤。OpenCV中提供了多种边缘检测算法,比如Sobel算子、Laplacian算子、Canny算子等。
// 图像边缘检测(Canny算子)
#include
using namespace cv;
int main(void)
{
Mat img = imread("path/to/image.png"); // 读入图像
Mat img_edges;
Canny(img, img_edges, 50, 150); // Canny边缘检测
namedWindow("Display Image", WINDOW_AUTOSIZE ); // 创建一个GUI窗口
imshow("Display Image", img_edges); // 在窗口中显示图像
waitKey(0); // 等待用户按下键盘
return 0;
}
三、图像识别和机器学习
1、目标检测
目标检测是计算机视觉中的一个重要分支,主要是指在图像或视频中自动检测和识别出目标。OpenCV中提供了多种目标检测算法,比如Haar特征检测、HOG特征检测、Cascade分类器等。
// 人脸检测
#include
using namespace cv;
int main(void)
{
// 加载预训练的分类器
CascadeClassifier face_cascade;
face_cascade.load("path/to/haarcascade_frontalface_alt.xml");
// 读入图像
Mat img = imread("path/to/image.png");
// 转换为灰度图像
Mat img_gray;
cvtColor(img, img_gray, COLOR_BGR2GRAY);
// 目标检测
std::vector
faces;
face_cascade.detectMultiScale(img_gray, faces, 1.1, 2, 0|CASCADE_SCALE_IMAGE, Size(30, 30));
// 在图像中标记出人脸
for (size_t i = 0; i < faces.size(); i++)
{
rectangle(img, faces[i], Scalar(0, 255, 0), 2);
}
// 显示结果
namedWindow("Display Image", WINDOW_AUTOSIZE );
imshow("Display Image", img);
waitKey(0);
return 0;
}
2、机器学习分类
OpenCV中的机器学习模块提供了众多机器学习算法,其中包括分类算法、回归算法、聚类算法等。通过机器学习算法,可以训练一个模型,将输入数据映射到输出结果。
// KNN分类器
#include
using namespace cv;
int main(void)
{
// 准备训练数据和标签
Mat trainingDataMat(3, 2, CV_32FC1);
Mat labelsMat(3, 1, CV_32FC1);
trainingDataMat.at
(0,0) = 10; trainingDataMat.at
(0,1) = 10;
trainingDataMat.at
(1,0) = 20; trainingDataMat.at
(1,1) = 20; trainingDataMat.at
(2,0) = 30; trainingDataMat.at
(2,1) = 30; labelsMat.at
(0,0) = 1; labelsMat.at
(1,0) = 2; labelsMat.at
(2,0) = 3; // 创建KNN分类器 Ptr
knn = ml::KNearest::create(); knn->train(trainingDataMat, ml::ROW_SAMPLE, labelsMat); // 预测分类 Mat testDataMat(1, 2, CV_32FC1); testDataMat.at
(0,0) = 15; testDataMat.at
(0,1) = 15; Mat response; knn->findNearest(testDataMat, 1, response); // 显示结果 std::cout << response << std::endl; return 0; }
四、结语
本文对OpenCV进行了全面详细的介绍,包括了OpenCV中的基础概念、图像处理实战和机器学习分类等内容。希望本文能够对大家了解OpenCV和图像处理算法有所帮助。