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:

相关推荐
m0_617493943 小时前
OpenCV cv2.circle() 坐标类型错误排查与修复指南
人工智能·opencv·计算机视觉
pjj1985413 小时前
opencv-轮廓特征和轮廓近似
人工智能·opencv·计算机视觉
老木避暑研究所18 小时前
基于OpenCV的避暑房采光分析与朝向优化——重庆云澜栖不同楼层日照时长实测
人工智能·opencv·计算机视觉
leoZ23119 小时前
Vue3 还原一个企业级后台-06-主布局设计
人工智能·opencv·机器学习·计算机视觉·数据挖掘·语音识别·caffe
欧特克_Glodon1 天前
OpenCV计算机视觉开发入门与实践<六>:OpenCV架构模块简介
c++·人工智能·opencv·计算机视觉
JeJe同学1 天前
Opencv之高斯金字塔
人工智能·opencv·计算机视觉
牧羊人.3331 天前
计算机视觉基础|第 6 章 轮廓检测、轮廓特征与轮廓近似
图像处理·opencv·计算机视觉
持敬chijing2 天前
PHP开发-环境搭建-安装phpstudy-vscode工具
开发语言·vscode·php
别动我齐刘海2 天前
机器学习基础2——C++、OpenCV、点云、Open3D
c++·人工智能·opencv·机器学习·计算机视觉·机器人·ros2
csdn_aspnet2 天前
Copilot能换成本地吗?VSCode接本地大模型本地化接入方案
ide·vscode·ai·ollama