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:

相关推荐
shy^-^cky22 分钟前
Python OpenCV 边缘检测效果对比
python·opencv·计算机视觉·边缘检测·sobel·canny·roberts
輕華31 分钟前
dlib人脸68关键点检测与轮廓绘制实战
opencv
꯭爿꯭巎꯭32 分钟前
visual studio code (vscode)下载
ide·vscode·编辑器
范什么特西42 分钟前
MyEclipse8.5配置
java·ide·myeclipse
Thomas21431 小时前
skill分享 iterm2 jupyter jumpserver
ide·python·jupyter
magic3341656312 小时前
ESP32S3开发环境介绍和创建工程
vscode·c·头文件
萌萌站起12 小时前
Vscode 中 python模块的导入问题
ide·vscode·python
aqiu~12 小时前
VSCode编辑器用于Unity项目
vscode·unity
王夏奇13 小时前
pycharm中3种不同类型的python文件
ide·python·pycharm
ShawnLiaoking14 小时前
pycharm 上传更新代码
ide·elasticsearch·pycharm