OpenCV C++ 示例大全
以下是 OpenCV 常用的 C++ 示例代码,涵盖图像处理、视频处理、特征检测等核心功能。这些示例涵盖了 OpenCV 最常用的功能,可以根据实际需求进行修改和扩展。
·
OpenCV C++ 示例大全
以下是 OpenCV 常用的 C++ 示例代码,涵盖图像处理、视频处理、特征检测等核心功能。
1. 基础示例
图像读取和显示
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 读取图像
cv::Mat image = cv::imread("image.jpg", cv::IMREAD_COLOR);
if (image.empty()) {
std::cout << "无法加载图像!" << std::endl;
return -1;
}
// 显示图像
cv::imshow("原始图像", image);
// 获取图像信息
std::cout << "图像宽度: " << image.cols << std::endl;
std::cout << "图像高度: " << image.rows << std::endl;
std::cout << "通道数: " << image.channels() << std::endl;
// 等待按键
cv::waitKey(0);
return 0;
}
图像保存
cv::Mat image = cv::imread("input.jpg");
if (!image.empty()) {
// 转换为灰度图
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
// 保存图像
cv::imwrite("output_gray.jpg", gray);
std::cout << "图像保存成功!" << std::endl;
}
2. 图像处理示例
图像转换
// 转换为灰度图
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
// 转换为HSV颜色空间
cv::Mat hsv;
cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV);
// 调整亮度和对比度
cv::Mat adjusted;
image.convertTo(adjusted, -1, 1.5, 50); // alpha=1.5, beta=50
图像滤波
// 高斯模糊
cv::Mat blurred;
cv::GaussianBlur(image, blurred, cv::Size(5, 5), 0);
// 中值滤波
cv::Mat median;
cv::medianBlur(image, median, 5);
// 双边滤波
cv::Mat bilateral;
cv::bilateralFilter(image, bilateral, 9, 75, 75);
边缘检测
// Canny边缘检测
cv::Mat edges;
cv::Canny(image, edges, 100, 200);
// Sobel算子
cv::Mat grad_x, grad_y;
cv::Sobel(image, grad_x, CV_16S, 1, 0);
cv::Sobel(image, grad_y, CV_16S, 0, 1);
cv::convertScaleAbs(grad_x, grad_x);
cv::convertScaleAbs(grad_y, grad_y);
cv::Mat sobel;
cv::addWeighted(grad_x, 0.5, grad_y, 0.5, 0, sobel);
3. 视频处理示例
摄像头捕获
cv::VideoCapture cap(0); // 打开默认摄像头
if (!cap.isOpened()) {
std::cout << "无法打开摄像头!" << std::endl;
return -1;
}
cv::Mat frame;
while (true) {
cap >> frame; // 捕获帧
if (frame.empty()) break;
// 处理帧(例如转换为灰度)
cv::Mat gray;
cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY);
cv::imshow("摄像头", gray);
if (cv::waitKey(1) == 27) break; // 按ESC退出
}
cap.release();
cv::destroyAllWindows();
视频文件处理
cv::VideoCapture cap("video.mp4");
if (!cap.isOpened()) {
std::cout << "无法打开视频文件!" << std::endl;
return -1;
}
// 获取视频属性
double fps = cap.get(cv::CAP_PROP_FPS);
int width = cap.get(cv::CAP_PROP_FRAME_WIDTH);
int height = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
std::cout << "FPS: " << fps << ", 分辨率: "
<< width << "x" << height << std::endl;
cv::Mat frame;
while (cap.read(frame)) {
cv::imshow("视频", frame);
if (cv::waitKey(1000/fps) == 27) break;
}
cap.release();
4. 特征检测示例
人脸检测
// 加载人脸检测器
cv::CascadeClassifier face_cascade;
if (!face_cascade.load("haarcascade_frontalface_default.xml")) {
std::cout << "无法加载人脸检测模型!" << std::endl;
return -1;
}
cv::Mat image = cv::imread("people.jpg");
cv::Mat gray;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
// 检测人脸
std::vector<cv::Rect> faces;
face_cascade.detectMultiScale(gray, faces, 1.1, 3, 0, cv::Size(30, 30));
// 绘制检测结果
for (const auto& face : faces) {
cv::rectangle(image, face, cv::Scalar(0, 255, 0), 2);
}
cv::imshow("人脸检测", image);
cv::waitKey(0);
角点检测
// Harris角点检测
cv::Mat gray, dst, dst_norm;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
cv::cornerHarris(gray, dst, 2, 3, 0.04);
cv::normalize(dst, dst_norm, 0, 255, cv::NORM_MINMAX, CV_32FC1);
// 绘制角点
for (int i = 0; i < dst_norm.rows; i++) {
for (int j = 0; j < dst_norm.cols; j++) {
if (dst_norm.at<float>(i, j) > 150) {
cv::circle(image, cv::Point(j, i), 5, cv::Scalar(0, 0, 255), 2);
}
}
}
5. 图像变换示例
几何变换
// 缩放
cv::Mat resized;
cv::resize(image, resized, cv::Size(), 0.5, 0.5); // 缩小一半
// 旋转
cv::Point2f center(image.cols/2.0, image.rows/2.0);
cv::Mat rot = cv::getRotationMatrix2D(center, 45, 1.0); // 旋转45度
cv::Mat rotated;
cv::warpAffine(image, rotated, rot, image.size());
// 仿射变换
cv::Point2f src_pts[3] = {{0,0}, {image.cols-1,0}, {0,image.rows-1}};
cv::Point2f dst_pts[3] = {{50,50}, {image.cols-60,30}, {40,image.rows-50}};
cv::Mat affine = cv::getAffineTransform(src_pts, dst_pts);
cv::Mat warped;
cv::warpAffine(image, warped, affine, image.size());
6. 图像分割示例
阈值分割
cv::Mat gray, binary;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
// 二值化
cv::threshold(gray, binary, 127, 255, cv::THRESH_BINARY);
// 自适应阈值
cv::Mat adaptive;
cv::adaptiveThreshold(gray, adaptive, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C,
cv::THRESH_BINARY, 11, 2);
轮廓检测
cv::Mat gray, binary;
cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
cv::threshold(gray, binary, 127, 255, cv::THRESH_BINARY);
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;
cv::findContours(binary, contours, hierarchy,
cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE);
// 绘制轮廓
cv::Mat result = image.clone();
cv::drawContours(result, contours, -1, cv::Scalar(0, 255, 0), 2);
7. 编译命令
Linux/macOS
g++ -std=c++11 example.cpp -o example \
`pkg-config --cflags --libs opencv4`
Windows (Visual Studio)
在项目属性中添加:
- 包含目录:
C:\opencv\build\include - 库目录:
C:\opencv\build\x64\vc16\lib - 附加依赖项:
opencv_world490.lib(Release) - 附加依赖项:
opencv_world490d.lib(Debug)
CMake 项目
cmake_minimum_required(VERSION 3.10)
project(OpenCVExample)
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(example example.cpp)
target_link_libraries(example ${OpenCV_LIBS})
这些示例涵盖了 OpenCV 最常用的功能,可以根据实际需求进行修改和扩展。
更多推荐
所有评论(0)