0
点赞
收藏
分享

微信扫一扫

机器学习和深度学习-- 李宏毅(笔记与个人理解)Day 14

朱小落 04-12 23:30 阅读 1
opencvc++

OpenCV C++ 学习笔记(一)

文章目录

写在前面

  • 网络上OpenCV C++ 的学习笔记相对Python比较少
  • 目的是记录学习过程同时希望能给到正在学习的朋友帮助
  • 大部分是参考官方教程 强烈推荐官方文档
  • OpenCV documentation index

安装

  • OpenCV库直接安装就行, 双击安装->选择安装目录->安装

在VS中使用

  • 新建VS工程

  • 右键属性 -> C/C++ -> 常规 -> 附加包含库目录 -> opencv的安装路径(如 D:\opencv\build\include)

  • 导入库:右键属性 -> 链接器 -> 常规 -> 附加库目录 -> 选择opencv build目录下 /x64/vc16/lib对应.lib(如:D:/opencv/build/x64/vc16/lib/opencv_world470d.lib

  • 也可以使用 #pragma

    #pragma comment(lib,"D:/opencv/build/x64/vc16/lib/opencv_world470d.lib")
    
  • 还需要注意一个vs 版本

  • 一些说明

  • opencv 安装后是可以通过配置环境变量改变 让使用变得更简单方便的

  • 但个人更倾向与手动配置 并且写在明处更容易看到的地方 方便后期拷贝到其它地方编译使用

可参考官方用法

一些小栗子

  • 图像变换
void example1()
{
    // 读取图像
    //cv::Mat img = cv::imread("./wallhaven-6oe337_1920x1080.png");
    cv::Mat img = cv::imread("image/lena.jpg");

    // 如果加入了opencv路径 OPENCV_SAMPLES_DATA_PATH  可直接使用下方法 
    //cv::Mat img = cv::imread(cv::samples::findFile("lena.jpg",true,true));
    if (img.empty())
    {
        std::cout << "imread image is empty";
        return;
    }

    cv::Mat gray,hsv;
    // 图像变换
    cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
    cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV);

    namedWindow("Original");
    // 显示图片
    cv::imshow("Original", img);
    // Gray
    cv::imshow("Gray", gray);
    cv::imshow("Hsv", hsv);

    // 等待任意按键按下 阻塞程序
    cv::waitKey(0);

    // 释放所有窗口
    cv::destroyAllWindows();

}
  • 修改对比度和亮度
// 设置对比度、亮度  g(i,j)=α⋅f(i,j)+β :
void example5()
{
    Mat img = imread("image/lena.jpg");
    if (img.empty())
    {
        std::cout << "image is empty" << std::endl;
        return;
    }

    Mat new_img = Mat::zeros(img.size(), img.type());
    double alpha = 3.0;     // Contrast 对比度 [1.0-3.0]
    int beta = 0;           // Brightness 亮度 [0-100]

    for (int y = 0; y < img.rows; y++) {
        for (int x = 0; x < img.cols; x++) {
            for (int c = 0; c < img.channels(); c++) {
                new_img.at<Vec3b>(y, x)[c] =
                    saturate_cast<uchar>(alpha * img.at<Vec3b>(y, x)[c] + beta);
            }
        }
    }
    imshow("Original Image",img);
    imshow("New Image", new_img);

    waitKey(0);
    destroyAllWindows();

    return;
}
  • 离散傅里叶变换
void example6()
{
    Mat I = imread("image/lena.jpg", IMREAD_GRAYSCALE);
    if (I.empty())
    {
        std::cout << "imread Falid";
        return;
    }

    // 输入图像展开最佳大小
    Mat padded;
    int m = getOptimalDFTSize(I.rows);  // 获取最佳DFT点数 一般是 2^N  且>= inputcount
    int n = getOptimalDFTSize(I.cols);

    // 按最佳DFT点数调整图像 并在周边填充0 
    copyMakeBorder(I, padded, 0, m - I.rows, 0, n - I.cols, BORDER_CONSTANT, Scalar::all(0));

    // 创建两个数组作为复数 虚部用0填充
    Mat planes[] = { Mat_<float>(padded),Mat::zeros(padded.size(),CV_32F) };
    Mat complexI;
    // 将多个单通道数组创建为一个多通道数组
    merge(planes, 2, complexI);
    // 离散傅里叶变换  in-place
    dft(complexI, complexI);

    // compute the magnitude and switch to logarithmic scale
    // => log(1 + sqrt(Re(DFT(I))^2 + Im(DFT(I))^2))
    split(complexI, planes);    // merge的反向操作 
    // 计算幅度 dst(I)= sqrt(x(I)^2+y(I)^2)
    magnitude(planes[0], planes[1], planes[0]);
    Mat magI = planes[0];

    // 对幅度 求log10  +1是避免出现log(0)
    magI += Scalar::all(1);
    log(magI, magI);

    normalize(magI, magI, 0, 1, NORM_MINMAX);
    imshow("magI",magI);

    // 如果频谱的行或列数为奇数,则对其进行裁剪
    magI = magI(Rect(0, 0, magI.cols & -2, magI.rows & -2));
    int cx = magI.cols / 2;
    int cy = magI.rows / 2;

    Mat q0(magI, Rect(0, 0, cx, cy)); //左上
    Mat q1(magI, Rect(cx, 0, cx, cy));  //右上
    Mat q2(magI, Rect(0, cy, cx, cy));  // 左下
    Mat q3(magI, Rect(cx, cy, cx, cy)); // 右下

    Mat tmp;
    q0.copyTo(tmp);     //交换象限(左上右下)
    q3.copyTo(q0);
    tmp.copyTo(q3);

    q1.copyTo(tmp);     //交换象限(右上与左下)
    q2.copyTo(q1);
    tmp.copyTo(q2);

    imshow("Input Image", I);
    imshow("Spectrum magintude", magI);
    waitKey(0);

    destroyAllWindows();
}

参考

官方文档

参考

举报

相关推荐

0 条评论