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:

相关推荐
行走的陀螺仪6 小时前
.vscode 文件夹配置详解
前端·ide·vscode·编辑器·开发实践
这儿有一堆花9 小时前
重磅推出!Google Antigravity:一次 “以 Agent 为中心 (agent-first)” 的 IDE 革命
vscode·ai·ai编程·googlecloud
j***518916 小时前
vscode配置django环境并创建django项目(全图文操作)
vscode·django·sqlite
skywalk816320 小时前
FreeBSD系统安装VSCode Server(未成功,后来是在FreeBSD系统里的Linux虚拟子系统里安装启动了Code Server)
ide·vscode·编辑器·freebsd
深海潜水员20 小时前
【MonoGame游戏开发】| 牧场物语实现 第一卷 : 农场基础实现 (下)
vscode·游戏·c#·.net·monogame
skywalk81631 天前
linux安装Code Server 以便Comate IDE和CodeBuddy等都可以远程连上来
linux·运维·服务器·vscode·comate
时光追逐者1 天前
Visual Studio 2026 现已正式发布,更快、更智能!
ide·c#·.net·visual studio
weixin_377634842 天前
【Git使用】PyCharm中的Git使用
ide·git·pycharm
深蓝海拓2 天前
opencv的模板匹配(Template Matching)学习笔记
人工智能·opencv·计算机视觉
喂自己代言2 天前
VS Code中提升效率的实用快捷键(中英双语版)
vscode