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:

相关推荐
*Lisen1 小时前
重新安装解决mac vscode点击不能跳转问题
ide·vscode·macos
小男孩tom2 小时前
vscode
ide·vscode·编辑器
Morpheon10 小时前
Cursor 1.0 版本 GitHub MCP 全面指南:从安装到工作流增强
ide·github·cursor·mcp
猿小猴子11 小时前
主流 AI IDE 之一的 Cursor 介绍
ide·人工智能·cursor
jndingxin14 小时前
OpenCV CUDA模块图像处理------创建一个模板匹配(Template Matching)对象函数createTemplateMatching()
图像处理·人工智能·opencv
吴声子夜歌16 小时前
OpenCV——Mat类及常用数据结构
数据结构·opencv·webpack
我命由我1234516 小时前
VSCode - VSCode 放大与缩小代码
前端·ide·windows·vscode·前端框架·编辑器·软件工具
old_power18 小时前
VSCode 工作区配置文件通用模板创建脚本
ide·vscode·编辑器
Lw老王要学习18 小时前
VScode 使用 git 提交数据到指定库的完整指南
windows·git·vscode
新知图书20 小时前
OpenCV为图像添加边框
人工智能·opencv·计算机视觉