目录结构 在opencv-4.12.0文件

 编译之前一定要安装好必须的库,否则即使提示编译成功,调用opencv后也可能会有问题

 
sudo apt-get update
sudo apt-get upgrade


sudo apt-get install -y g++            
sudo apt-get install -y cmake
sudo apt-get install -y make
sudo apt-get install -y wget 
sudo apt-get install -y unzip
sudo apt-get install -y git


sudo apt-get install build-essential pkg-config 
 sudo apt-get install libgtk2.0-dev libgtk-3-dev libglib2.0-dev libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libv4l-dev liblapacke-dev libxvidcore-dev libx264-dev
 sudo apt-get install python-dev python-numpy
 sudo apt-get install libgstreamer-plugins-base1.0-dev libgstreamer1.0-dev
 sudo apt-get install libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper1 libjasper-dev libdc1394-22-dev libopenexr-dev libwebp-dev
 sudo apt-get install libatlas-base-dev gfortran 
 sudo apt-get install ffmpeg

以下是编译opencv4.12的命令(有更多的参数待研究)

sudo cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local/opencv4.12 -D OPENCV_ENABLE_NONFREE=ON -D OPENCV_GENERATE_PKGCONFIG=YES -D OPENCV_EXTRA_MODULES_PATH=/home/mwj/pycode/opencv4.12/opencv-4.12.0/opencv_contrib-4.12.0/modules ..

可进入build目录后,右键打开终端

重要备注:

这一条参数是最终opencv生成的位置,默认是/usr/local/,此次我指定了一个文件夹opencv4.12

-D CMAKE_INSTALL_PREFIX=/usr/local/opencv4.12

自定义生成opencv目录的话这个参数建议加上,不然Clion中的CmakeLists.txt可能找不到opencv

-D OPENCV_GENERATE_PKGCONFIG=YES

cmake之后,就是编译

sudo make -j6

sudo make install

正常情况下 Clion CMakeLists.txt中设置成以下内容就可以了

cmake_minimum_required(VERSION 3.31)
# 定义项目名称
project(untitled6)
# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 17)
# OpenCV 目录设置
#set(OpenCV_DIR "G:\\Open412MinGw11.2viz")
# 查找 OpenCV 包
find_package(OpenCV REQUIRED)
# 包含 OpenCV 头文件目录
include_directories(${OpenCV_INCLUDE_DIRS})
# 查找项目中的所有 .cpp 源文件,排除 CMake 生成目录
file(GLOB_RECURSE SOURCES
        ${CMAKE_SOURCE_DIR}/*.cpp
        ${CMAKE_SOURCE_DIR}/*.hpp
)
# 手动排除掉 CMake 生成的 CMakeFiles 目录
list(FILTER SOURCES EXCLUDE REGEX "/CMakeFiles/")
# 将找到的文件添加到可执行文件中
add_executable(untitled6 ${SOURCES})
# 链接 OpenCV 库
target_link_libraries(untitled6 ${OpenCV_LIBS})

或者:

project(untitled6)

# 设置C++标准
set(CMAKE_CXX_STANDARD 17)

# 查找OpenCV包
find_package(OpenCV REQUIRED)

# 包含OpenCV头文件目录
include_directories(${OpenCV_INCLUDE_DIRS})

# 添加可执行文件
add_executable(untitled6 main.cpp)

# 链接OpenCV库
target_link_libraries(untitled6 ${OpenCV_LIBS})

用以下的内容,可能会提示:undefined reference to `cv::imread(std::__cxx11::basi

cmake_minimum_required(VERSION 3.28)
project(untitled8)

set(CMAKE_CXX_STANDARD 17)

add_executable(untitled8 main.cpp)

find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})

Clion如果没有下载可以用命令下载 sudo snap install clion --classic

Clion现在有免费版本了

#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>

using namespace cv;
using namespace std;

int main() {
    // 创建一个空白图像
    const int width = 800;
    const int height = 600;
    Mat image = Mat::zeros(height, width, CV_8UC3);
    image.setTo(Scalar(255, 255, 255)); // 设置背景为白色

    // 圆的参数
    Point center(width/2, height/2);
    int radius = 200;
    Scalar circleColor(0, 0, 255); // 红色
    int thickness = 3;

    // 绘制圆
    circle(image, center, radius, circleColor, thickness);

    // 计算内嵌等边三角形的三个顶点
    vector<Point> trianglePoints;
    for (int i = 0; i < 3; i++) {
        double angle = CV_PI/2 + i * 2 * CV_PI / 3; // 从垂直向上开始,每隔120度一个点
        int x = center.x + radius * cos(angle);
        int y = center.y - radius * sin(angle); // 注意y轴向下为正
        trianglePoints.push_back(Point(x, y));
    }

    // 绘制三角形
    vector<vector<Point>> contours;
    contours.push_back(trianglePoints);
    Scalar triangleColor(0, 255, 0); // 绿色
    drawContours(image, contours, 0, triangleColor, thickness);

    // 显示图像
    namedWindow("Circle with Inscribed Triangle", WINDOW_NORMAL);
    imshow("Circle with Inscribed Triangle", image);

    // 等待按键退出
    waitKey(0);

    return 0;
}    

 #include <opencv2/opencv.hpp>
 #include <opencv2/xfeatures2d.hpp>//SIFT SURF

#include<iostream>
#include<vector>

constexpr auto path0 = "1.jpg";
constexpr auto path1 = "2.jpg";

int main() {
	cv::Mat image0 = cv::imread(path0, 1);
	cv::Mat image1 = cv::imread(path1, 1);

	cv::imshow("image0", image0);
	cv::imshow("image1", image1);
	/*
	step1:特征检测器
	*/
	cv::Ptr<cv::xfeatures2d::SURF> detector;
	detector = cv::xfeatures2d::SURF::create(800);  //800为海塞矩阵阈值,越大越精准

	/*
	-----SURF----
	cv::Ptr<cv::xfeatures2d::SURF> detector;
	detector = cv::xfeatures2d::SURF::create(800);  //800为海塞矩阵阈值,越大越精准
	-----SIFT-----
	cv::Ptr<cv::xfeatures2d::SIFT> detector;
	detector = cv::xfeatures2d::SIFT::create(800);//800为保留的点数
	-----ORB------
	cv::Ptr<cv::ORB> detector;
	detector  = cv::ORB::create(800);//保留点数
	-----STAR-----
	cv::Ptr<cv::xfeatures2d::StarDetector> detector;
	detector = cv::xfeatures2d::StarDetector::create();
	-----MSD-----
	cv::Ptr<cv::xfeatures2d::MSDDetector> detector;
	detector = cv::xfeatures2d::MSDDetector::create();
	*/
	std::vector <cv::KeyPoint > key0;
	std::vector <cv::KeyPoint > key1;
	detector->detect(image0,key0,cv::noArray());
	detector->detect(image1, key1, cv::noArray());

	/*
	step2:描述子提取器
	*/
	cv::Ptr<cv::xfeatures2d::SURF> Extractor;
	Extractor = cv::xfeatures2d::SURF::create(800);
	/*
       以下都是xfeature2d中的提取器
	-----SURF-----
	-----SIFT-----
	-----LUCID----
	-----BriefDescriptorExtractor----
	-----VGG-----
	-----BoostDesc-----
	*/
	cv::Mat descriptor0, descriptor1;
	Extractor->compute(image0, key0, descriptor0);
	Extractor->compute(image1, key1, descriptor1);

	/*
	step3:匹配器
	*/
	cv::BFMatcher matcher;//暴力匹配器
	std::vector<cv::DMatch> matches; // 存放匹配结果
	std::vector<cv::DMatch> good_matches; //存放好的匹配结果

	matcher.match(descriptor0, descriptor1, matches);
	std::sort(matches.begin(), matches.end());     //筛选匹配点,根据match里面特征对的距离从小到大排序

	int ptsPairs = std::min(50, (int)(matches.size() * 0.15));
	std::cout << "匹配点数为" << ptsPairs << std::endl;
	for (int i = 0; i < ptsPairs; i++)
	{
		good_matches.push_back(matches[i]);              //距离最小的50个压入新的DMatch
	}

	cv::Mat result;

	cv::drawMatches(image0, key0,
		image1, key1,
		good_matches, result,
		cv::Scalar::all(-1), cv::Scalar::all(-1),
		std::vector<char>(),
		cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);  //绘制匹配点

	cv::imshow("result", result);
	cv::waitKey(0);
}

可能会遇到undefined reference to cv::imread(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)'

这可能是clion里面的工具链的原因,要选择系统,因为opencv是由系统的g++编译的

(可选设置)

sudo gedit /etc/ld.so.conf
sudo gedit /etc/ld.so.conf.d/opencv.conf

添加:/usr/local/opencv4.12/lib

更新:

sudo ldconfig
或者
sudo /sbin/ldconfig

如果Clion中找不到opencv,可以设置变量

先打开 sudo gedit ~/.bashrc

export PKG_CONFIG_PATH=/usr/local/opencv4.12/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/opencv4.12/lib

 保存之后,再执行命令source ~/.bashrc

 以下是vscode中调用c++ opencv

.vscode文件夹下面创建3个json (参考,根据实际路径修改)

c_cpp_properties.json

{
    "configurations": [
        {
            "name": "Linux",
            "includePath": [
                "${workspaceFolder}/**",
            
                "/usr/local/opencv4.12/include/opencv4"
            ],
            "defines": [],
            "compilerPath": "/usr/bin/gcc",
            "cStandard": "gnu11",
            "cppStandard": "gnu++14",
            "intelliSenseMode": "linux-gcc-x64"
        }
    ],
    "version": 4
}

launch.json

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "g++ - Build and debug active file",
            "type": "cppdbg",
            "request": "launch",
            "program": "${fileDirname}/${fileBasenameNoExtension}",  //程序文件路径
            "args": [],  //程序运行需传入的参数
            "stopAtEntry": false,
            "cwd": "${fileDirname}",
            "environment": [],
            "externalConsole": true,   //运行时是否显示控制台窗口
            "MIMode": "gdb",
            "setupCommands": [
                {
                    "description": "Enable pretty-printing for gdb",
                    "text": "-enable-pretty-printing",
                    "ignoreFailures": true
                }
            ],
            "preLaunchTask": "C/C++: g++ build active file",
            "miDebuggerPath": "/usr/bin/gdb"
        }
    ]
}

tasks.json

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++ build active file",  /* 与launch.json文件里的preLaunchTask的内容保持一致 */
            "command": "/usr/bin/g++",
            "args": [
                "-std=c++11",
                "-g",
                "${file}",   /* 编译单个文件 */
                // "${fileDirname}/*.cpp",  /* 编译多个文件 */
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}",  /* 输出文件路径 */
 
                /* 项目所需的头文件路径 */
                "-I","${workspaceFolder}/",
                "-I","/usr/local/opencv4.12/include/",
                "-I","/usr/local/opencv4.12/include/opencv4/",
                "-I","/usr/local/opencv4.12/include/opencv4/opencv2",
 
                /* 项目所需的库文件路径 */
                "-L", "/usr/local/opencv4.12/lib",
 
                /* OpenCV的lib库 */
                "/usr/local/opencv4.12/lib/libopencv_*"
 
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Task generated by Debugger."
        }
    ],
    "version": "2.0.0"
}

如果有qt也可以配置到qt中,当然和qt结合使用的话,编译的时候最好with_qt选项打勾

cmake -D CMAKE_BUILD_TYPE=RELEASE \
          -D CMAKE_INSTALL_PREFIX=/usr/local \
          -D INSTALL_C_EXAMPLES=OFF \
          -D INSTALL_PYTHON_EXAMPLES=OFF \
          -D ENABLE_FAST_MATH=ON \
          -D BUILD_opencv_java=OFF \
          -D BUILD_ZLIB=ON \
          -D BUILD_TIFF=ON \
          -D WITH_GTK=ON \
          -D WITH_FFMPEG=ON \
          -D WITH_1394=ON \
          -D OPENCV_GENERATE_PKGCONFIG=ON \
          -D OPENCV_PC_FILE_NAME=opencv4.pc \
          -D OPENCV_ENABLE_NONFREE=ON \
          -D WITH_GSTREAMER=ON \
          -D WITH_V4L=ON \
          -D WITH_QT=ON \
          -D WITH_OPENGL=ON \
          -D OPENCV_EXTRA_MODULES_PATH=../../opencv_contrib/modules \
          -D BUILD_EXAMPLES=ON ..

qt中.pro文件夹中的设置:

# 以下是opencv的引用

INCLUDEPATH +=  /usr/local/opencv4.12/include\
                /usr/local/opencv4.12/include/opencv4 \
                /usr/local/opencv4.12/include/opencv4/opencv2

LIBS += /usr/local/opencv4.12/lib/libopencv_*.so \

扩展思考:pkg-config --modversion opencv4 这个命令是从哪里获取opencv版本的

pkg-config --modversion opencv4

 是通过 opencv4.pc 这个文件来获取 OpenCV 的版本信息的。
 

📌 它的工作原理如下:

✅ 1. pkg-config 是一个工具

它用于管理库的编译和链接参数,比如:

  • 库的版本号(如你看到的 4.12.0
  • 编译时需要加的头文件路径(-I/usr/local/opencv4.12/include/opencv4
  • 链接时需要加的库路径和库名(-L/usr/local/opencv4.12/lib -lopencv_core ...

pkg-config 会去环境变量 PKG_CONFIG_PATH 指定的路径中查找名为 opencv4.pc 的文件。

你可以用这个命令查看它到底用了哪个 .pc 文件:

小技巧:验证 .pc 文件是否被正确使用

# 查看 .pc 文件路径

pkg-config --variable pcfiledir opencv4

# 输出示例: # /usr/local/opencv4.12/lib/pkgconfig

如果提示:

可以设置变量,根据自己的opencv生成位置

先打开 sudo gedit ~/.bashrc

export PKG_CONFIG_PATH=/usr/local/opencv4.12/lib/pkgconfig
export LD_LIBRARY_PATH=/usr/local/opencv4.12/lib

更新配置:

source ~/.bashrc

# 查看完整配置内容 pkg-config --dump opencv4

 以下是opencv4.pc内容

# Package Information for pkg-config

prefix=/usr/local/opencv4.12
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include/opencv4

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.12.0
Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_alphamat -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dnn_superres -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_hfs -lopencv_img_hash -lopencv_intensity_transform -lopencv_line_descriptor -lopencv_mcc -lopencv_quality -lopencv_rapid -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_signal -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_highgui -lopencv_datasets -lopencv_text -lopencv_plot -lopencv_videostab -lopencv_videoio -lopencv_viz -lopencv_wechat_qrcode -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_video -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_imgcodecs -lopencv_features2d -lopencv_dnn -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir}

新增情况说明 :

如果用的是ubuntu22.04

运行c++ opencv可能有以下提示:

The function is not implemented. Rebuild the library with Windows, GTK+ 2.x or Cocoa support. If you are on Ubuntu or Debian, install libgtk2.0-dev and pkg-config

这种情况 可能要先重新 

sudo apt-get install libgtk2.0-dev  

ubuntu22的话估计 自动会装到libgtk2.1

编译之前应该运行过以下命令(难道单独执行和多个库一起执行有区别?)

 sudo apt-get install libgtk2.0-dev libgtk-3-dev libglib2.0-dev libavcodec-dev libavformat-dev libswscale-dev libavutil-dev libv4l-dev liblapacke-dev libxvidcore-dev libx264-dev

不管如何当我重新执行 sudo apt-get install libgtk2.0-dev  后,再重新 编译  生成 就正常了

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐