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

  1. 基本图像读取和显示
// 读取图像
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;
}

  1. 图像属性获取和修改:
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);
  1. 新图像的创建:
 // 创建黑色图像
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);
  1. 图像处理
// 读取图像
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();