ubuntu24.04lts CLion 安装使用,测试c++ opencv

CLion

使用 Ubuntu?

CLion 现在也以 snap 软件包的形式提供。如果您使用 Ubuntu 16.04 或更高版本,可以使用命令行安装 CLion。

sudo snap install clion --classic

 安装好后可以在应用里面找到Clion图标,打开之后选择试用30天或激活

需要中文界面 可在插件市场安装中文语言包

 

 

 运行默认代码

 也可用自己的代码测试hello c++

测试opencv(之前编译过4.5.4版本ubuntu24.04lts cmake编译 opencv4.5.4 contrib的一些问题-CSDN博客

CMakeLists.txt 内容设置如下,有

cmake_minimum_required(VERSION 3.28)
project(testopen)

set(CMAKE_CXX_STANDARD 11)

add_executable(testopen main.cpp)

find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})

target_link_libraries(testopen ${OpenCV_LIBS})

运行后有错误

terminate called after throwing an instance of 'cv::Exception'
  what():  OpenCV(4.5.4) /home/mwj/open4.5.4/opencv-4.5.4/modules/core/src/array.cpp:2494: error: (-206:Bad flag (parameter or structure field)) Unrecognized or unsupported array type in function 'cvGetMat'

 经网上查询后,是图片路径写法的问题,本来在同一个目录的图片,直接写图片名就可以了,之前在vscode中运行正常,Clion中可能需要设置,当然如果写绝对路径应该是没有问题的

constexpr auto path0 = "/home/mwj/CLionProjects/testopen/1.jpg";
constexpr auto path1 = "/home/mwj/CLionProjects/testopen/2.jpg";

或者如下图设置

 #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);
}

我记得编译opencv的时候,设置的的是RELEASE,但现在不管是debug还是release都能运行,不清楚为什么,有了解情况的朋友可留言

-D CMAKE_BUILD_TYPE=RELEASE

下面是2个问题对话AI

1. 问:ubuntu为什么clion中CMakeLists.txt 内容 这样设置就能找到opencv目录了

答:在 Ubuntu 中使用 CLion 配置 CMake 项目时,通过在 CMakeLists.txt 文件中添加如下内容可以成功找到 OpenCV 的目录,原因如下:

  1. find_package(OpenCV REQUIRED):

    • 这一行会指示 CMake 自动查找 OpenCV 库及其相关的头文件。
    • 当 CMake 执行这行代码时,它会搜索预定义的路径来找到 OpenCV 的配置文件(通常为 OpenCVConfig.cmakeopencv-config.cmake),这些路径通常是在安装 OpenCV 时自动设置的。
    • 如果 OpenCV 安装在标准系统路径(如 /usr/local/usr)下,CMake 会自动找到它。
  2. include_directories(${OpenCV_INCLUDE_DIRS}):

    • 这一行会将 OpenCV 的头文件路径添加到编译器的搜索路径中。
    • ${OpenCV_INCLUDE_DIRS}find_package 查找到的头文件目录的变量,CMake 自动填充它。
  3. target_link_libraries(testopen ${OpenCV_LIBS}):

    • 这一行将 OpenCV 库链接到你的可执行文件中。
    • ${OpenCV_LIBS}find_package 发现的库文件路径及库名的变量。

由于 find_package(OpenCV REQUIRED) 会根据 OpenCV 的安装位置自动配置所需的变量,通常情况下,你不需要手动指定 OpenCV 的目录。CMake 会根据系统配置和安装位置自动找到这些路径,因此在 CLion 中这样设置 CMakeLists.txt 就能正确找到 OpenCV。

 2.问:ubuntu编译c++ opencv的时候,设置的是RELEASE,但现在不管是debug还是release都能运行

答:

在 Ubuntu 上编译 C++ 项目时,通常你会使用 ReleaseDebug 构建类型。这两种构建类型的主要区别在于:

  • Release 构建:生成优化的二进制文件,去除了调试信息,运行速度更快。
  • Debug 构建:生成未优化的二进制文件,包含调试信息,便于调试。

如果你的项目在 DebugRelease 模式下都能运行,有以下几个可能的原因:

  1. OpenCV 被配置为多配置(Multi-Configuration)构建:

    • 如果你安装的 OpenCV 是通过 apt-get 或其他包管理器安装的,通常会包含多个配置版本。也就是说,它可能同时包含 ReleaseDebug 版本的库文件,并且可以在两种构建模式下使用。
    • 这意味着,无论你选择 Release 还是 Debug,CMake 都会找到相应的 OpenCV 库版本。
  2. OpenCV 是动态链接的:

    • 如果你的项目是动态链接的(使用 .so 文件),系统库路径中可能已经包含了 OpenCV 的动态库,并且这些库文件可以在任何构建模式下使用。
    • 动态库的行为是独立于编译模式的,只要编译时的头文件和链接库一致,不同模式下都可以运行。
  3. 调试版本和发布版本的兼容性:

    • 在某些情况下,DebugRelease 构建之间的差异并不会对代码的运行产生直接影响,特别是在没有使用特定的优化或调试功能时。
    • 如果你使用的 OpenCV 功能较为基础,没有涉及到调试符号或高级优化,可能不会明显区分 DebugRelease
  4. CMake 的默认配置:

    • 如果你在 CMake 中没有显式设置构建类型(例如没有使用 cmake -DCMAKE_BUILD_TYPE=Release),CMake 可能会使用系统的默认配置,这可能是 Release,但如果你的项目是以一种通用的方式设置的,那么它可以兼容不同的构建类型。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

养牛大人

感谢您的鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值