OpenCV C++学习案例(详细讲解注释)
1、人脸识别学习案例
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
void main() {
string path = "D://YWYW//photo//test.png";//图片路径
Mat img = imread(path);//读入图片
if (img.empty())//判定图片是否为空
{
cout << "image is empty" << endl;
return;
}
CascadeClassifier faceCascade;//创建级联分类器
//载入训练模型(opencv安装目录下的build文件下自带)
faceCascade.load("D://Users//tester//Downloads//opencv//build//etc//haarcascades//haarcascade_frontalface_default.xml");
if (faceCascade.empty()) { cout << "XML file not loaded" << endl; }
//检查文件是否打开 没打开时执行打印语句
vector<Rect>faces;//创建人脸存放的vector
faceCascade.detectMultiScale(img, faces, 1.1, 10);
//detectMultiScale函数可以检测出图片中所有的人脸,并用vector保存各个人脸的坐标、大小
//在原图像中画出人脸矩形边框
for (int i = 0; i < faces.size(); i++)
{
//前面三个参数分别为
//img:输入/输出图像,即要在其上绘制矩形的图像。
//pt1:矩形的左上角顶点坐标(Point类型)。
//pt2:矩形的右下角顶点坐标(Point类型)。
rectangle(img, faces[i].tl(), faces[i].br(), Scalar(255, 0, 255), 3);//画矩形框
}
imshow("Image", img);//显示图片
waitKey(0);
}
2、图片分割案例
将一张图片分割成自定义的大小一致的多张图片
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main() {
// 读取原始图像
Mat originalImage = imread("D://YWYW//photo//TailorTest.png");//图片路径
if (originalImage.empty()) {
cerr << "Failed to read the image." << endl;//判定图片是否为空
return -1;
}
// 确定裁剪后的图像大小
int width = originalImage.cols / 3; // 新图像宽度为原始图像宽度的1/3
int height = originalImage.rows;
// 创建裁剪后的图像容器
vector<Mat> croppedImages;
for (int i = 0; i < 3; i++) {
Mat croppedImage = originalImage(Rect(i * width, 0, width, height)).clone();//裁剪函数
croppedImages.push_back(croppedImage);
}
// 保存裁剪后的图像
for (int i = 0; i < 3; i++) {
string savePath = "D://YWYW//photo//cropped_image_" + to_string(i + 1) + ".jpg";
imwrite(savePath, croppedImages[i]);//保存到特定的路径下
}
cout << "Images saved successfully." << endl;
return 0;
}
3、图像拼接
#include <iostream>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
// 图像拼接函数
Mat concatImages(const vector<Mat>& images, bool isHorizontal) {
// 检查图像数量是否为零
if (images.empty()) {
cerr << "No images provided for concatenation." << endl;
return Mat();
}
// 检查图像尺寸是否一致
Size imageSize = images[0].size();
for (const Mat& image : images) {
if (image.size() != imageSize) {
cerr << "Image sizes are not consistent." << endl;
return Mat();
}
}
// 拼接图像
Mat result;
if (isHorizontal)
hconcat(images, result);
else
vconcat(images, result);
return result;
}
int main() {
// 读取图像
Mat image1 = imread("D://YWYW//photo//cropped_image_1.jpg");
Mat image2 = imread("D://YWYW//photo//cropped_image_2.jpg");
Mat image3 = imread("D://YWYW//photo//cropped_image_3.jpg");
// 检查图像是否成功读取
if (image1.empty() || image2.empty() || image3.empty()) {
cerr << "Failed to read the images." << endl;
return -1;
}
// 图像拼接
vector<Mat> images = { image1, image2, image3 };
Mat concatenatedImage = concatImages(images, true); // true表示水平拼接,false表示垂直拼接
// 显示拼接结果
namedWindow("Concatenated Image", WINDOW_NORMAL);
imshow("Concatenated Image", concatenatedImage);
waitKey(0);
return 0;
}
不断更新中…