OpenCV读取照片和可视化详解和代码示例
下面进行 OpenCV 读取照片和可视化(显示) 的详解与完整 C++ 示例代码,适用于 Windows 或 Linux 平台的 OpenCV 4.x 版本。
一、核心函数简析
函数 | 功能 |
---|---|
cv::imread() | 从文件读取图像 |
cv::imshow() | 在窗口中显示图像 |
cv::waitKey() | 等待键盘输入(防止窗口闪退) |
cv::imwrite() | 保存图像到文件 |
cv::resize() | 图像缩放(可选) |
cv::cvtColor() | 图像颜色空间转换(如 BGR→灰度) |
二、完整 C++ 示例代码
#include <opencv2/opencv.hpp>
#include <iostream>int main() {// 1. 图像文件路径(支持相对或绝对路径)std::string imagePath = "example.jpg"; // 确保文件存在于工作目录// 2. 使用 imread 读取图像(默认 BGR 读入)cv::Mat image = cv::imread(imagePath, cv::IMREAD_COLOR); // 或 cv::IMREAD_GRAYSCALE// 3. 检查图像是否成功加载if (image.empty()) {std::cerr << "无法加载图像: " << imagePath << std::endl;return -1;}// 4. 可选:调整图像大小cv::Mat resizedImage;cv::resize(image, resizedImage, cv::Size(640, 480)); // 改变为 640x480// 5. 显示图像cv::imshow("原图", image);cv::imshow("缩放图", resizedImage);// 6. 等待用户按任意键关闭窗口std::cout << "按任意键关闭图像窗口..." << std::endl;cv::waitKey(0); // 0 表示无限等待return 0;
}
三、常用参数说明(imread
和 imshow
)
cv::imread(path, flag)
常见 flag 值:
标志 | 含义 |
---|---|
IMREAD_COLOR (默认) | 读入彩色图,忽略 alpha 通道 |
IMREAD_GRAYSCALE | 灰度图 |
IMREAD_UNCHANGED | 保留 alpha 通道 |
cv::waitKey(ms)
:
-
等待
ms
毫秒内的键盘输入,如果ms = 0
,表示无限等待。 -
可以捕获键值,例如:
int key = cv::waitKey(0); if (key == 27) { // 27 是 ESCstd::cout << "按下了 ESC,退出程序" << std::endl; }
四、图像保存示例
cv::imwrite("resized_output.jpg", resizedImage);
五、常见问题排查
问题 | 原因 | 解决方案 |
---|---|---|
image.empty() 为真 | 图像路径错误、文件不存在或格式不支持 | 检查路径和扩展名,建议用绝对路径测试 |
imshow 窗口一闪而过 | 没有 cv::waitKey() | 加上 cv::waitKey(0) |
中文路径无法读取 | OpenCV 不支持中文路径(Windows) | 将文件放入英文路径下 |
颜色异常 | OpenCV 默认是 BGR 而非 RGB | 转换:cv::cvtColor(img, img_rgb, cv::COLOR_BGR2RGB); |
六、拓展建议
-
加载多图显示:
std::vector<std::string> imgs = {"1.jpg", "2.jpg"}; for (const auto& path : imgs) {cv::Mat img = cv::imread(path);cv::imshow(path, img); } cv::waitKey(0);
-
显示灰度图:
cv::Mat gray; cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY); cv::imshow("灰度图", gray);