以下案例以如下870*489图像为准:

- 基本图像读取和显示
// 读取图像
cv::Mat image = cv::imread("input.jpg", cv::IMREAD_COLOR);
// 检查图像是否成功加载
if (image.empty()) {
std::cout << "无法加载图像!" << std::endl;
return;
}
std::cout << "图像信息:" << std::endl;
// 870 x 489
std::cout << "尺寸: " << image.cols << " x " << image.rows << std::endl;
// 3
std::cout << "通道数: " << image.channels() << std::endl;
// 16
std::cout << "数据类型: " << image.type() << std::endl;
// 显示图像
cv::imshow("原始图像", image);
cv::waitKey(0);
// 保存图像
bool success = cv::imwrite("output_basic.png", image);
if (success) {
std::cout << "图像保存成功!" << std::endl;
}
else {
std::cout << "图像保存失败!" << std::endl;
}
- 图像属性获取和修改:
cv::Mat image = cv::imread("input.jpg");
if (image.empty()) return;
// 获取图像属性
std::cout << "=== 图像属性 ===" << std::endl;
// 870
std::cout << "宽度: " << image.cols << " 像素" << std::endl;
// 489
std::cout << "高度: " << image.rows << " 像素" << std::endl;
// 425430
std::cout << "总像素数: " << image.total() << std::endl;
// 3
std::cout << "通道数: " << image.channels() << std::endl;
// 矩阵元素的深度 0表示cv::CV_8U,矩阵是以8位无符号整数形式存储
std::cout << "深度: " << image.depth() << std::endl;
// 16,数据类型是一个编码值,使用公式 (深度类型) + (通道数-1) × 8表示
std::cout << "数据类型: " << image.type() << std::endl;
// 矩阵元素的大小 为3,在opencv中"元素"表示一个像素占用的字节数
std::cout << "元素大小: " << image.elemSize() << " 字节" << std::endl;
// 是 为了提高性能,可以在图像的每行末尾用额外的像素进行填充,如果图像中没有填充像素,这个方法就返回true
std::cout << "是否连续: " << (image.isContinuous() ? "是" : "否") << std::endl;
// 1 step[0]表示每行的字节数
std::cout << (image.step[0] == (size_t)(image.cols * image.elemSize())) << std::endl;
// 3 step[0]表示每个像素的字节数
std::cout << image.step[1] << std::endl;
// 访问和修改像素值
if (image.channels() == 3) {
// 获取(100,100)位置的像素值(BGR格式)
cv::Vec3b pixel = image.at<cv::Vec3b>(100, 100);
std::cout << "像素(100,100) - B:" << (int)pixel[0]
<< " G:" << (int)pixel[1]
<< " R:" << (int)pixel[2] << std::endl;
// 修改像素值(设置为红色)
image.at<cv::Vec3b>(100, 100) = cv::Vec3b(0, 0, 255);
}
cv::imshow("修改后的图像", image);
cv::waitKey(0);
- 新图像的创建:
// 创建黑色图像
cv::Mat black_image(480, 640, CV_8UC3, cv::Scalar(0, 0, 0));
// 创建白色图像
cv::Mat white_image(480, 640, CV_8UC3, cv::Scalar(255, 255, 255));
// 创建彩色图像
cv::Mat blue_image(480, 640, CV_8UC3, cv::Scalar(255, 0, 0)); // 蓝色
cv::Mat green_image(480, 640, CV_8UC3, cv::Scalar(0, 255, 0)); // 绿色
cv::Mat red_image(480, 640, CV_8UC3, cv::Scalar(0, 0, 255)); // 红色
// 创建渐变图像
cv::Mat gradient(480, 640, CV_8UC3);
for (int i = 0; i < gradient.rows; i++) {
for (int j = 0; j < gradient.cols; j++) {
gradient.at<cv::Vec3b>(i, j) = cv::Vec3b(
j * 255 / gradient.cols, // B通道渐变
i * 255 / gradient.rows, // G通道渐变
128 // R通道固定
);
}
}
// 保存创建的图像
cv::imwrite("black.jpg", black_image);
cv::imwrite("white.jpg", white_image);
cv::imwrite("blue.jpg", blue_image);
cv::imwrite("green.jpg", green_image);
cv::imwrite("red.jpg", red_image);
cv::imwrite("gradient.jpg", gradient);
cv::imshow("渐变图像", gradient);
cv::waitKey(0);
- 图像处理
// 读取图像
cv::Mat original = cv::imread("input.jpg");
if (original.empty()) return;
// 1. 转换为灰度图
cv::Mat gray;
cv::cvtColor(original, gray, cv::COLOR_BGR2GRAY);
cv::imwrite("step1_gray.jpg", gray);
// 2. 高斯模糊
cv::Mat blurred;
cv::GaussianBlur(original, blurred, cv::Size(15, 15), 0);
cv::imwrite("step2_blurred.jpg", blurred);
// 3. 边缘检测
cv::Mat edges;
cv::Canny(gray, edges, 50, 150);
cv::imwrite("step3_edges.jpg", edges);
// 4. 调整亮度
cv::Mat brightened = original + cv::Scalar(50, 50, 50);
cv::imwrite("step4_brightened.jpg", brightened);
// 5. 调整对比度
cv::Mat contrasted = original * 1.5;
cv::imwrite("step5_contrasted.jpg", contrasted);
// 显示所有处理结果
cv::imshow("1. 原图", original);
cv::imshow("2. 灰度图", gray);
cv::imshow("3. 模糊图", blurred);
cv::imshow("4. 边缘检测", edges);
cv::imshow("5. 亮度增强", brightened);
cv::imshow("6. 对比度增强", contrasted);
cv::waitKey(0);
cv::destroyAllWindows();
浙公网安备 33010602011771号