Opencv基础用法学习2

发布时间:2024年01月16日

案例1:调整图片颜色

在opencv中的读图方式是BGR,常见的读图方式是RGB

// opencv 调整颜色
#include "opencv2/opencv.hpp"
#include <iostream>

int main()
{
    // 读取图片
    cv::Mat src = cv::imread("./media/dog.jpg");
    // BGR -> Gray
    cv::Mat gray;
    // 三个参数分别是输入图像、输出图像、转换方式
    cv::cvtColor(src, gray, cv::COLOR_BGR2GRAY);
    // BGR -> HSV,Hue(色调)、Saturation(饱和度)、Value(明度)
    cv::Mat hsv;
    cv::cvtColor(src, hsv, cv::COLOR_BGR2HSV);
    // BGR -> RGB
    cv::Mat rgb;
    cv::cvtColor(src, rgb, cv::COLOR_BGR2RGB);


    // 保存
    cv::imwrite("./output/1.gray.jpg", gray);
    cv::imwrite("./output/1.hsv.jpg", hsv);
    cv::imwrite("./output/1.rgb.jpg", rgb);
    

    return 0;
}

案例2:图像滤波处理

// opencv 图像滤波
#include "opencv2/opencv.hpp"
#include <iostream>


int main()
{
    // 读取图片
    cv::Mat src = cv::imread("./media/dog.jpg");
    // 高斯模糊
    cv::Mat blur;
    // 三个参数分别是输入图像、输出图像、卷积核大小
    cv::GaussianBlur(src, blur, cv::Size(7, 7), 0);

    // 膨胀
    cv::Mat dilate;
    // 三个参数分别是输入图像、输出图像、卷积核大小
    cv::dilate(src, dilate, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)));

    // 腐蚀
    cv::Mat erode;
    // 三个参数分别是输入图像、输出图像、卷积核大小
    cv::erode(src, erode, cv::getStructuringElement(cv::MORPH_RECT, cv::Size(5, 5)));

    // 保存
    cv::imwrite("./output/2.blur.jpg", blur);
    cv::imwrite("./output/2.dilate.jpg", dilate);
    cv::imwrite("./output/2.erode.jpg", erode);
    return 0;
}

案例3:图片形状调整及拼接翻转操作

// 形状调整
#include "opencv2/opencv.hpp"
#include <iostream>
#include <vector>

int main()
{
    // 读取图像
    cv::Mat cat_img = cv::imread("./media/cat.jpg");

    // ======== resize ========
    cv::Mat cat_resize;
    // 三个参数分别是输入图像、输出图像、输出图像大小
    cv::resize(cat_img, cat_resize, cv::Size(320, 240));
    // 保存
    cv::imwrite("./output/3.cat_resize.jpg", cat_resize);

    // ======== copy ========
    cv::Mat copy;
    cat_img.copyTo(copy);
    cv::imwrite("./output/3.copy.jpg", copy);

    // ======== ROI裁剪 ========
    cv::Rect rect(100, 100, 200, 100); // x, y, width, height
    cv::Mat roi = cat_img(rect);
    cv::imwrite("./output/3.roi.jpg", roi);

    // ======== 拼接 ========
    cv::Mat dog_img = cv::imread("./media/dog.jpg");
    cv::Mat dog_resize;
    cv::resize(dog_img, dog_resize, cv::Size(320, 240));

    // 水平拼接,需要保证两张图片的高度(rows)一致
    cv::Mat hconcat_img;
    cv::hconcat(cat_resize, dog_resize, hconcat_img);
    cv::imwrite("./output/3.hconcat.jpg", hconcat_img);

    // 或者使用vector方式
    std::vector<cv::Mat> imgs{cat_resize, dog_resize, cat_resize, dog_resize};
    cv::Mat hconcat_img2;
    cv::hconcat(imgs, hconcat_img2);
    cv::imwrite("./output/3.hconcat2.jpg", hconcat_img2);

    // 数组方式
    cv::Mat imgs_arr[] = {dog_resize, cat_resize, dog_resize, cat_resize};
    cv::Mat hconcat_img3;
    cv::hconcat(imgs_arr, 4, hconcat_img3); // 4是数组长度
    cv::imwrite("./output/3.hconcat3.jpg", hconcat_img3);

    // 垂直拼接,需要保证两张图片的宽度(cols)一致
    cv::Mat vconcat_img;
    cv::vconcat(cat_resize, dog_resize, vconcat_img);
    cv::imwrite("./output/3.vconcat.jpg", vconcat_img);

    // ======== 翻转 ========
    cv::Mat flip;
    // 三个参数分别是输入图像、输出图像、翻转方向
    cv::flip(cat_img, flip, 1); // 1表示水平翻转,0表示垂直翻转,-1表示水平垂直翻转
    cv::imwrite("./output/3.flip.jpg", flip);

    // ======== 旋转 ========
    cv::Mat rotate;
    // 三个参数分别是输入图像、输出图像、旋转角度
    cv::rotate(cat_img, rotate, cv::ROTATE_90_CLOCKWISE); // 顺时针旋转90度
    cv::imwrite("./output/3.rotate.jpg", rotate);

    return 0;
}

案例4:绘制文字和图形

// 绘制文字和图形
#include "opencv2/opencv.hpp"
#include <iostream>
#include <vector>

int main()
{
    // 创建一个黑色图像,参数分别是图像大小、图像类型,CV_8UC3表示8位无符号整数,3通道
    cv::Mat image = cv::Mat::zeros(cv::Size(600, 600), CV_8UC3);
    
    // 绘制直线,参数分别是图像、起点、终点、颜色、线宽、线型
    cv::line(image, cv::Point(50, 50), cv::Point(350, 250), cv::Scalar(0, 0, 255), 2, cv::LINE_AA);
    // 绘制矩形,参数分别是图像、左上角、右下角、颜色、线宽、线型
    cv::rectangle(image, cv::Point(50, 50), cv::Point(350, 250), cv::Scalar(0, 255, 0), 2, cv::LINE_AA);
    // 绘制圆形,参数分别是图像、圆心、半径、颜色、线宽、线型
    cv::circle(image, cv::Point(200, 150), 100, cv::Scalar(255, 0, 0), 2, cv::LINE_AA);
    // 实心
    cv::circle(image, cv::Point(200, 150), 50, cv::Scalar(255, 0, 0), -1, cv::LINE_AA);

    // // ================== 多边形 ==================
    // cv::Point points[2][4]; // 定义两个多边形的顶点数组
    // // 第一个多边形的顶点
    // points[0][0] = cv::Point(100, 115);
    // points[0][1] = cv::Point(255, 135);
    // points[0][2] = cv::Point(140, 365);
    // points[0][3] = cv::Point(100, 300);
    // // 第二个多边形的顶点
    // points[1][0] = cv::Point(300, 315);
    // points[1][1] = cv::Point(555, 335);
    // points[1][2] = cv::Point(340, 565);
    // points[1][3] = cv::Point(300, 500);
    // // ppt[] 要同时添加两个多边形顶点数组的地址)
    // const cv::Point *pts_v[] = {points[0], points[1]};
    // // npts_v[]要定义每个多边形的顶点数
    // int npts_v[] = {4, 4};
    // // 绘制多边形,参数分别是图像、顶点数组、顶点数、曲线数量、是否闭合、颜色、线宽、线型
    // cv::polylines(image, pts_v, npts_v, 2, true, cv::Scalar(255, 0, 255), 2, 8, 0);

    // ================== 使用vector绘制多边形 ==================
    std::vector<cv::Point> points_v;
    // 随机生成5个点
    for (int i = 0; i < 5; i++)
    {
        points_v.push_back(cv::Point(rand() % 600, rand() % 600));
    }
    // 绘制多边形,参数分别是图像、顶点容器、是否闭合、颜色、线宽、线型
    cv::polylines(image, points_v, true, cv::Scalar(255, 0, 0), 2, 8, 0);

    // ================== 绘制文字 ==================
    // 参数分别是图像、文字、文字位置、字体、字体大小、颜色、线宽、线型
    cv::putText(image, "Hello World!", cv::Point(400, 50), cv::FONT_HERSHEY_SIMPLEX, 1.0, cv::Scalar(255, 255, 255), 2, 8, 0);

    

    // 保存
    cv::imwrite("./output/4.drawing.jpg", image);
    return 0;
}

文章来源:https://blog.csdn.net/m0_48095841/article/details/135634381
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。