opencv C++项目
时间: 2023-10-02 07:05:33 浏览: 108
OpenCV 是一个基于开源许可的计算机视觉库,它提供了一些常见的算法和工具,可以用于图像处理、计算机视觉、机器学习等领域。下面是一个使用 OpenCV C++ 实现的简单项目示例:
1. 人脸检测
在 OpenCV 中,使用 Haar 特征分类器可以进行人脸检测。以下是人脸检测的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char** argv)
{
// 加载人脸分类器
CascadeClassifier faceCascade;
faceCascade.load("haarcascade_frontalface_alt.xml");
// 打开摄像头
VideoCapture cap(0);
if (!cap.isOpened())
{
cout << "无法打开摄像头!" << endl;
return -1;
}
// 不断读取摄像头数据
while (true)
{
Mat frame;
cap >> frame;
// 转换为灰度图像
Mat gray;
cvtColor(frame, gray, COLOR_BGR2GRAY);
// 调整图像大小,加速检测
resize(gray, gray, Size(), 0.5, 0.5);
// 检测人脸
vector<Rect> faces;
faceCascade.detectMultiScale(gray, faces, 1.1, 2, 0, Size(30, 30));
// 绘制矩形框标记人脸
for (int i = 0; i < faces.size(); ++i)
{
rectangle(frame, Point(faces[i].x * 2, faces[i].y * 2),
Point((faces[i].x + faces[i].width) * 2,
(faces[i].y + faces[i].height) * 2), Scalar(0, 255, 0), 2);
}
// 显示图像
imshow("人脸检测", frame);
// 检测按键
int key = waitKey(30);
if (key == 27) // ESC
{
break;
}
}
// 关闭摄像头
cap.release();
return 0;
}
```
2. 图像识别
OpenCV 中的 DNN 模块提供了深度学习模型的支持,可以用于图像识别和目标检测等任务。以下是一个使用预训练模型进行图像识别的示例代码:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, const char** argv)
{
// 加载预训练模型
dnn::Net net = dnn::readNetFromTensorflow("frozen_inference_graph.pb", "graph.pbtxt");
// 打开图像
Mat image = imread("image.jpg");
if (image.empty())
{
cout << "无法打开图像!" << endl;
return -1;
}
// 调整图像大小,加速识别
resize(image, image, Size(300, 300));
// 创建 Blob
Mat blob = dnn::blobFromImage(image, 1.0, Size(300, 300), Scalar(127.5, 127.5, 127.5), true, false);
// 输入 Blob 到网络中进行识别
net.setInput(blob);
Mat output = net.forward();
// 解析输出结果
Mat detectionMat(output.size[2], output.size[3], CV_32F, output.ptr<float>());
for (int i = 0; i < detectionMat.rows; ++i)
{
float confidence = detectionMat.at<float>(i, 2);
if (confidence > 0.5)
{
int left = static_cast<int>(detectionMat.at<float>(i, 3) * image.cols);
int top = static_cast<int>(detectionMat.at<float>(i, 4) * image.rows);
int right = static_cast<int>(detectionMat.at<float>(i, 5) * image.cols);
int bottom = static_cast<int>(detectionMat.at<float>(i, 6) * image.rows);
// 绘制矩形框标记识别结果
rectangle(image, Point(left, top), Point(right, bottom), Scalar(0, 255, 0), 2);
}
}
// 显示图像
imshow("图像识别", image);
waitKey(0);
return 0;
}
```
以上是 OpenCV C++ 的两个示例项目,希望对你有帮助!
阅读全文