(三)OpenCv C++版入门级教程

**OpenCv 图像的基本操作 **
图像的四种基本操作:访问和修改像素值、图像 ROI (Region of Interest) 操作、图像通道分离与合并、以及图像的缩放、旋转、平移和翻转

常用方法:

操作 函数/方法 说明
访问像素值 image[y, x] 获取或修改像素值。
图像 ROI image[y1:y2, x1:x2] 获取或修改图像中的矩形区域。
通道分离与合并 cv2.split() / cv2.merge() 分离或合并图像通道。
图像缩放 cv2.resize() 调整图像大小。
图像旋转 cv2.getRotationMatrix2D() 旋转图像。
图像平移 cv2.warpAffine() 平移图像。
图像翻转 cv2.flip() 翻转图像。
图像加法 cv2.add() 对两幅图像进行加法运算。
图像减法 cv2.subtract() 对两幅图像进行减法运算。
图像混合 cv2.addWeighted() 对两幅图像进行加权混合。
阈值处理 cv2.threshold() 对图像进行阈值处理。
平滑处理 cv2.blur() / cv2.GaussBlur() 对图像进行平滑处理。

1.访问像素和修改像素值

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    cv::Mat img = cv::imread("image.jpg");

    // 检查图像是否成功加载
    if (img.empty()) 
    {
        std::cout << "Could not open or find the image!" << std::endl;
        return -1;
    }
    // 访问像素值
    //使用img.at<cv::Vec3b>(100, 150)访问图像中(100, 150)位置的像素值
    cv::Vec3b pixelValue = img.at<cv::Vec3b>(100, 150); 
    std::cout << "Pixel value: " << static_cast<int>(pixelValue[0]) << ", "
              << static_cast<int>(pixelValue[1]) << ", "
              << static_cast<int>(pixelValue[2]) << std::endl;
   //修改像素值
   // 将(150, 100) 位置的像素值设置为白色
   img.at<cv::Vec3b>(150, 100) = cv::Vec3b(255, 255, 255);  
   
   return 0;
}

2.图像ROI操作
ROI 是指图像中我们感兴趣的区域。通过提取 ROI,我们可以只对图像的特定部分进行处理,从而提高处理效率。

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 假设 img 是一个已经加载的图像
    cv::Mat img = cv::imread("path_to_image.jpg");

    if (img.empty())
     {
        std::cout << "Could not open or find the image" << std::endl;
        return -1;
    }

    // 提取 ROI
    cv::Mat roi = img(cv::Rect(0, 0, 100, 100));

    // 修改 ROI
    roi.setTo(cv::Scalar(0, 255, 0));  // 将 ROI 区域设置为绿色

    // 将修改后的 ROI 放回原图像
    // 注意:在C++中,直接修改 roi 会自动更新 img 中相应的区域,无需显式放回

    // 显示图像(可选)
    cv::imshow("Image with ROI", img);
    cv::waitKey(0);

    return 0;
}

3.图像通道分离与合并

#include <opencv2/opencv.hpp>

// 假设img是一个Mat类型的变量,表示输入图像
cv::Mat b, g, r;
cv::split(img, std::vector<cv::Mat>{b, g, r});

// 通道合并,为彩色图像保存在merged_img
cv::Mat merged_img;
cv::merge(std::vector<cv::Mat>{b, g, r}, merged_img);

4.图像缩放、旋转、平移、翻转

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    // 读取图像
    cv::Mat img = cv::imread("dog.jpg");
    if (img.empty()) 
    {
        std::cout << "Could not open or find the image!" << std::endl;
        return -1;
    }

    // 图像缩放
    cv::Mat resized_img;
    cv::resize(img, resized_img, cv::Size(200, 200));  // 将图像缩放为 200x200 像素

    // 图像旋转
    int h = img.rows;
    int w = img.cols;
    cv::Point2f center(w / 2.0, h / 2.0);
    cv::Mat M = cv::getRotationMatrix2D(center, 45, 1.0);  // 旋转 45 度
    cv::Mat rotated_img;
    cv::warpAffine(img, rotated_img, M, cv::Size(w, h));

    // 图像平移
    M = (cv::Mat_<double>(2, 3) << 1, 0, 100, 0, 1, 50);  // 向右平移 100 像素,向下平移 50 像素
    cv::Mat translated_img;
    cv::warpAffine(img, translated_img, M, cv::Size(w, h));

    // 图像翻转
    cv::Mat flipped_img;
    cv::flip(img, flipped_img, 1);  // 水平翻转

    // 显示图像
    cv::imshow("Original Image", img);
    cv::imshow("Resized Image", resized_img);
    cv::imshow("Rotated Image", rotated_img);
    cv::imshow("Translated Image", translated_img);
    cv::imshow("Flipped Image", flipped_img);

    // 等待按键按下
    cv::waitKey(0);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值