vscode + cmake + opencv example

nice try on macos

CMakeLists.txt

txt 复制代码
cmake_minimum_required(VERSION 3.20)
#添加OPENCV库
#指定OpenCV版本,代码如下
#find_package(OpenCV 3.3 REQUIRED)
#如果不需要指定OpenCV版本,代码如下
find_package(OpenCV REQUIRED)
 
#添加OpenCV头文件
include_directories(${OpenCV_INCLUDE_DIRS})
 
#显示OpenCV_INCLUDE_DIRS的值
message(${OpenCV_INCLUDE_DIRS})
 
# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable( main main.cpp )
 
# 将库文件链接到可执行程序上
target_link_libraries( main  ${OpenCV_LIBS})
file(GLOB allCopyFiles  "./*.jpg")
file(COPY ${allCopyFiles} DESTINATION .) #copy any .jpg file to <build> dir

# 或者
# file(GLOB allCopyFiles "${NSF_HOME}/lib/*")
# execute_process(COMMAND cp ${allCopyFiles} ${LIB})

main.cpp

cpp 复制代码
    #include <iostream>
    #include "opencv2/imgproc.hpp"
    #include "opencv2/ximgproc.hpp"
    #include "opencv2/imgcodecs.hpp"
    #include "opencv2/highgui.hpp"
    using namespace std;
    using namespace cv;
    using namespace cv::ximgproc;
    int main(int argc, char **argv)
    {
        string in;
        // 修改图片
        CommandLineParser parser(argc, argv, "{@input|me.jpg|input image}{help h||show help message}");
        if (parser.has("help"))
        {
            parser.printMessage();
            return 0;
        }
        in = samples::findFile(parser.get<string>("@input"));
        Mat image = imread(in, IMREAD_GRAYSCALE);
        if (image.empty())
        {
            return -1;
        }
        // Create FLD detector
        // Param               Default value   Description
        // length_threshold    10            - Segments shorter than this will be discarded
        // distance_threshold  1.41421356    - A point placed from a hypothesis line
        //                                     segment farther than this will be
        //                                     regarded as an outlier
        // canny_th1           50            - First threshold for
        //                                     hysteresis procedure in Canny()
        // canny_th2           50            - Second threshold for
        //                                     hysteresis procedure in Canny()
        // canny_aperture_size 3            - Aperturesize for the sobel operator in Canny().
        //                                     If zero, Canny() is not applied and the input
        //                                     image is taken as an edge image.
        // do_merge            false         - If true, incremental merging of segments
        //                                     will be performed
        int length_threshold = 10;
        float distance_threshold = 1.41421356f;
        double canny_th1 = 50.0;
        double canny_th2 = 50.0;
        int canny_aperture_size = 3;
        bool do_merge = false;
        Ptr<FastLineDetector> fld = createFastLineDetector(length_threshold,
                                                        distance_threshold, canny_th1, canny_th2, canny_aperture_size,
                                                        do_merge);
        vector<Vec4f> lines;
        // Because of some CPU's power strategy, it seems that the first running of
        // an algorithm takes much longer. So here we run the algorithm 10 times
        // to see the algorithm's processing time with sufficiently warmed-up
        // CPU performance.
        for (int run_count = 0; run_count < 5; run_count++)
        {
            double freq = getTickFrequency();
            lines.clear();
            int64 start = getTickCount();
            // Detect the lines with FLD
            fld->detect(image, lines);
            double duration_ms = double(getTickCount() - start) * 1000 / freq;
            cout << "Elapsed time for FLD " << duration_ms << " ms." << endl;
        }
        // Show found lines with FLD
        Mat line_image_fld(image);
        fld->drawSegments(line_image_fld, lines);
        imshow("FLD result", line_image_fld);
        waitKey(1);
        Ptr<EdgeDrawing> ed = createEdgeDrawing();
        ed->params.EdgeDetectionOperator = EdgeDrawing::SOBEL;
        ed->params.GradientThresholdValue = 38;
        ed->params.AnchorThresholdValue = 8;
        vector<Vec6d> ellipses;
        for (int run_count = 0; run_count < 5; run_count++)
        {
            double freq = getTickFrequency();
            lines.clear();
            int64 start = getTickCount();
            // Detect edges
            // you should call this before detectLines() and detectEllipses()
            ed->detectEdges(image);
            // Detect lines
            ed->detectLines(lines);
            double duration_ms = double(getTickCount() - start) * 1000 / freq;
            cout << "Elapsed time for EdgeDrawing detectLines " << duration_ms << " ms." << endl;
            start = getTickCount();
            // Detect circles and ellipses
            ed->detectEllipses(ellipses);
            duration_ms = double(getTickCount() - start) * 1000 / freq;
            cout << "Elapsed time for EdgeDrawing detectEllipses " << duration_ms << " ms." << endl;
        }
        Mat edge_image_ed = Mat::zeros(image.size(), CV_8UC3);
        vector<vector<Point>> segments = ed->getSegments();
        for (size_t i = 0; i < segments.size(); i++)
        {
            const Point *pts = &segments[i][0];
            int n = (int)segments[i].size();
            polylines(edge_image_ed, &pts, &n, 1, false, Scalar((rand() & 255), (rand() & 255), (rand() & 255)), 1);
        }
        imshow("EdgeDrawing detected edges", edge_image_ed);
        Mat line_image_ed(image);
        fld->drawSegments(line_image_ed, lines);
        // Draw circles and ellipses
        for (size_t i = 0; i < ellipses.size(); i++)
        {
            Point center((int)ellipses[i][0], (int)ellipses[i][1]);
            Size axes((int)ellipses[i][2] + (int)ellipses[i][3], (int)ellipses[i][2] + (int)ellipses[i][4]);
            double angle(ellipses[i][5]);
            Scalar color = ellipses[i][2] == 0 ? Scalar(255, 255, 0) : Scalar(0, 255, 0);
            ellipse(line_image_ed, center, axes, angle, 0, 360, color, 2, LINE_AA);
        }
        imshow("EdgeDrawing result", line_image_ed);
        waitKey();
        return 0;
    }

提供一张名叫me.jpg的文件到build文件夹下

REF LINKS:

相关推荐
pzx_0011 小时前
【内积】内积计算公式及物理意义
数据结构·python·opencv·算法·线性回归
hzw05103 小时前
Jupyter的使用
ide·python·jupyter
CV-King5 小时前
计算机视觉硬件知识点整理(三):镜头
图像处理·人工智能·python·opencv·计算机视觉
棒棒糖的糖不含糖7 小时前
idea生成类信息及快捷开发配置
ide
计算机学姐7 小时前
基于PHP的电脑线上销售系统
开发语言·vscode·后端·mysql·编辑器·php·phpstorm
JANGHIGH8 小时前
VSCode值得推荐的插件(持续更新中)
ide·vscode·编辑器
WenGyyyL8 小时前
变脸大师:基于OpenCV与Dlib的人脸换脸技术实现
人工智能·python·opencv
jndingxin9 小时前
OpenCV运动分析和目标跟踪(4)创建汉宁窗函数createHanningWindow()的使用
人工智能·opencv·目标跟踪
jndingxin10 小时前
OpenCV特征检测(1)检测图像中的线段的类LineSegmentDe()的使用
人工智能·opencv·计算机视觉
Zhangci]11 小时前
Opencv图像预处理(三)
人工智能·opencv·计算机视觉