C++椭圆检测论文复现 Ubuntu 22.04+Vscode+opencv3.4

复现的代码

本博客旨在复现论文《An Efficient High-quality Ellipse Detection》,该文章本来只有Matlab的代码实现,后来被islands翻译成了c++ 库,大家可以参考islands发在知乎上的文章高质量椭圆检测库,C++的代码链接。

 使用环境

Ubuntu 22.04

lsb_release -aDistributor ID:	Ubuntu
Description:	Ubuntu 22.04.4 LTS
Release:	22.04
Codename:	jammy

Cmake 3.22.1

cmake -versioncmake version 3.22.1

C++ 11.4.0

g++ -vgcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 

Opencv   3.4.9

pkg-config --modversion opencv3.4.9

安装C++编译器

 查看自己的C++编译器版本

cmake --version

cmake version 3.22.1

如果没有安装cmake,那么可以使用指令自行安装

sudo apt-get install cmake
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev

安装opencv

 通过官网,使用代码安装opencv https://github.com/opencv/opencv/releases

我选择了opencv3.4.9,选择最后的Source.code(tar.gz)进行下载。

下载完毕后放入合适的路径,进行解压。

之后创建release文件夹,并进行编译

mkdir release
cd release
cmake ..
sudo make
sudo make install 

验证opencv是否安装成功

#include <iostream>
#include <opencv2/opencv.hpp>int main() {std::cout << "OpenCV version: " << CV_VERSION << std::endl;return 0;
}

卸载opencv

sudo make uninstall
cd ..
sudo rm -r build

安装Lapack

确定已安装gfortran

sudo apt-get install gfortran

源码安装Lapack,下载并解压

进行编译

cd lapack-3.9.1
mkdir build
cd build
cmake ..
make -j7
sudo make install
sudo ldconfig
cd ..
sudo cp LAPACKE/include/*.h /usr/local/include/

Ellipse detectieon C++库

完成基础环境的配置之后我们就可以去编译Ellipse detection了。参考库中的Readme进行安装。

git clone https://github.com/memory-overflow/standard-ellipse-detection.git
cd standard-ellipse-detection
mkdir build && cd build
cmake ..
make
sudo make install

出错‘cv::Mat’ to non-scalar type

!亲测:使用opencv3.3.0不会报错,因此使用opencv3.3.0时不需要修改代码。

如果你和我一样,那么可能会在camek时出现如下错误。

 from ‘cv::Mat’ to non-scalar type ‘CvMat’ requested

根据错误的位置定位到,源代码位置: standard-ellipse-detection/src/cvcannyapi.cpp的307行,我们将之前的代码进行修改,修改后代码如下。参考博文

  CvMat c_src = cvMat(src), c_dst = cvMat(_edges.getMat());CvMat c_dx = cvMat(_sobel_x.getMat());CvMat c_dy = cvMat(_sobel_y.getMat());

配置.vscode

c_cpp_properties.json

Ctrl+Shift+P -> C/C++:Edit Configurations(UI),生成c_cpp_properties.json文件

IntelliSense mode选择  linux-gcc-x64,

在Include path中添加opencv的path,具体c_cpp_properties.json文件如下。

{"configurations": [{"name": "Linux","includePath": ["${default}","/usr/local/include/opencv","/usr/local/include/opencv2"],"defines": [],"compilerPath": "/usr/bin/gcc","cStandard": "c17","cppStandard": "gnu++17","intelliSenseMode": "linux-gcc-x64"}],"version": 4
}
tasks.json

Ctrl+Shift+P -> Tasks: Configure Tasks,选择编译器,生成tasks.json文件。

在tasks.json中加入opencv库,Lapack库,以及刚刚安装的ellipse_detection库,tasks.json的示例如下,主要逐一args中的参数。"-lellipse_detection","`pkg-config","--libs","--cflags","opencv`","-llapacke","-llapack","-lblas","-lgfortran"。

"-lellipse_detection",

{"tasks": [{"type": "cppbuild","label": "C/C++: g++ build active file","command": "/usr/bin/g++","args": ["-fdiagnostics-color=always","-g","${file}","-o","${fileDirname}/${fileBasenameNoExtension}","-lellipse_detection","`pkg-config","--libs","--cflags","opencv`","-llapacke","-llapack","-lblas","-lgfortran"],"options": {"cwd": "${fileDirname}"},"problemMatcher": ["$gcc"],"group": {"kind": "build","isDefault": true},"detail": "Task generated by Debugger."}],"version": "2.0.0"
}

测试

我们使用作者提供的测试代码进行测试,代码位置在standard-ellipse-detection/test,我们对testdetect.cpp进行编译。如果顺利的话,那么就可以编译成功了。之后调用testdetect应用程序就可以看到椭圆检测以及之后的图了。

./testdetect "/path/to/image"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/734586.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ROS2动作通信的实现

文章目录 1.动作通信的概念及应用场景1.1 概念1.2 应用场景 2.准备工作3.动作通信的实现3.1 动作通信接口消息3.2 服务端实现3.3 客户端实现3.4 编译及运行 1.动作通信的概念及应用场景 1.1 概念 动作通信适用于长时间运行的任务。就结构而言动作通信由目标、反馈和结果三部分…

吴恩达机器学习-可选实验室:可选实验:使用逻辑回归进行分类(Classification using Logistic Regression)

在本实验中&#xff0c;您将对比回归和分类。 import numpy as np %matplotlib widget import matplotlib.pyplot as plt from lab_utils_common import dlc, plot_data from plt_one_addpt_onclick import plt_one_addpt_onclick plt.style.use(./deeplearning.mplstyle)jupy…

第三百九十二回

文章目录 1. 概念介绍2. 方法与细节2.1 实现方法2.2 具体细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何混合选择多个图片和视频文件"相关的内容&#xff0c;本章回中将介绍如何通过相机获取图片文件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. …

JavaWeb--Maven

一&#xff1a;概述 1.简介 Maven 是专门用于管理和构建 Java 项目的工具&#xff0c;它的主要功能有&#xff1a; 提供了一套标准化的项目结构 提供了一套标准化的构建流程&#xff08;编译&#xff0c;测试&#xff0c;打包&#xff0c;发布 …… &#xff09; 提供了一套…

Minio搭建文件服务器

目录 一、Minio使用&#x1f355;1.1 Minio介绍1.2 Minio安装1.3 Minio入门 二、创建后端服务&#x1f953;2.1创建一个SpringBoot项目2.2 代码实现2.2.1 FileUploadController2.3.2 FileUploadService2.3.3 MinioProperties2.3.4 MinioServerApplication2.2.4 配置文件内容 三…

如何使用固定公网地址SFTP远程传输文件至安卓Termux本地目录?

文章目录 1. 安装openSSH2. 安装cpolar3. 远程SFTP连接配置4. 远程SFTP访问4. 配置固定远程连接地址 SFTP&#xff08;SSH File Transfer Protocol&#xff09;是一种基于SSH&#xff08;Secure Shell&#xff09;安全协议的文件传输协议。与FTP协议相比&#xff0c;SFTP使用了…

misc40

下载附件&#xff0c;发现只有第三个wav文件需要密码&#xff0c;其他都可以看 打开 conversion.txt 二进制转十进制得到202013 开 一张普通的二维码.png&#xff0c;直接扫不出结果。 010查看图片尾部发现 Brainfuck 编码 解码得到&#xff1a; 和谐民主和谐文明和谐和谐和谐…

数据分析-Pandas数据分组箱线图

数据分析-Pandas数据分组箱线图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&#x…

在垃圾回收时哪些可以作为垃圾回收的根对象?

1.System.class 由启动类加载器加载的类&#xff0c;一些核心的类&#xff0c;不如说 2.Native Stack java虚拟机在执行方法调用时必须执行操作系统方法&#xff0c;操作系统方法执行时所引用的一些java对象。 3.Thread 活动线程所引用的一些对象。 4.Busy monitor 被同…

深度学习-Softmax 回归 + 损失函数 + 图片分类数据集

Softmax 回归 损失函数 图片分类数据集 1 softmax2 损失函数1均方L1LossHuber Loss 3 图像分类数据集4 softmax回归的从零开始实现 1 softmax Softmax是一个常用于机器学习和深度学习中的激活函数。它通常用于多分类问题&#xff0c;将一个实数向量转换为概率分布。Softmax函…

Spring Boot 自动装配的原理!!!

SpringBootApplication SpringBootConfiguration&#xff1a;标识启动类是一个IOC容器的配置类 EnableAutoConfiguration&#xff1a; AutoConfigurationPackage&#xff1a;扫描启动类所在包及子包中所有的组件&#xff0c;生…

C++特殊类设计【特殊类 || 单例对象 || 饿汉模式 || 懒汉模式】

目录 一&#xff0c;特殊类设计 1. 只在堆上创建的类 2. 只允许在栈上创建的类 3. 不能被继承的类 4. 不能被拷贝的类 5. 设计一个类&#xff0c;只能创建一个对象&#xff08;单例对象&#xff09; 饿汉模式 懒汉模式 C11静态成员初始化多线程安全问题 二&#xff…

linux安装ngnix完整步骤(支持centos/银河麒麟操作系统)

linux安装ngnix&#xff08;支持centos/银河麒麟操作系统&#xff09; 本次操作系统安装ngnix采用离线或在线安装方式&#xff0c;离线就是不联网环境&#xff0c;在线则是联网环境&#xff1b;支持centos7或centos8或国产操作系统&#xff08;银河麒麟高级服务器操作系统&…

element-ui radio 组件源码分享

今日简单分享 radio 组件的实现原理&#xff0c;主要从以下三个方面来分享&#xff1a; 1、radio 页面结构 2、radio 组件属性 3、radio 组件方法 一、radio 页面结构 1.1 页面结构如下&#xff1a; 二、radio 属性 2.1 value / v-model 属性&#xff0c;类型为 string / …

鲜为人知的闰年判定大坑

【题目描述】 输入年份&#xff0c;判断是否为闰年。如果是&#xff0c;则输出yes&#xff0c;否则输出no。 提示&#xff1a;简单地判断除以4的余数是不够的。 【题目来源】 刘汝佳《算法竞赛入门经典 第2版》习题1-7 年份&#xff08;year&#xff09; 【解析】 一、闰…

Decontam去污染:一个尝试

为了程序运行的便利性&#xff0c;不想将Decontam放到windows的Rstudio里面运行&#xff0c;需要直接在Ubuntu中运行&#xff0c;并且为了在Decontam时进行其他操作&#xff0c;使用python去运行R 首先你需要有一个conda环境&#xff0c;安装了R&#xff0c;Decontam&#xff0…

云计算的部署方式(公有云、私有云、混合云、社区云)

云计算的部署方式(公有云、私有云、混合云、社区云) 目录 零、00时光宝盒 一、云计算的部署方式 1.1、公有云&#xff08;Public Cloud&#xff09; 1.2、私有云&#xff08;Private Cloud&#xff09;  1.3、混合云&#xff08;Hybrid Cloud&#xff09; 1.4、社区云&am…

【C++】list模拟实现list迭代器失效问题

list模拟实现&list迭代器失效问题 一&#xff0c;list模拟实现1. list的主要框架接口模拟2. list构造&拷贝构造&析构3. list迭代器3.1 普通迭代器3.2 const迭代器 4. 增删查改 二&#xff0c;迭代器失效问题1. list的迭代器失效原因2. 解决办法 一&#xff0c;list…

Java 汇编源码查看环境搭建

目录 一、简介 二、在IDEA开发环境中搭建汇编环境 2.1 在IDEA中搭建字节码查看环境 2.1.1 搭建步骤 2.1.1.1 第一步 2.1.1.2 第二步 2.1.1.3 第三步 2.1.1.4 第四步 2.1.2 验证 2.2 在IDEA开发环境中搭建汇编代码查看环境 2.2.2 配置HSDIS插件 2.2.3 验证HSDIS插件是…

[虚拟机保护逆向] [HGAME 2023 week4]vm

[虚拟机保护逆向] [HGAME 2023 week4]vm 虚拟机逆向的注意点&#xff1a;具体每个函数的功能&#xff0c;和其对应的硬件编码的*长度* 和 *含义*&#xff0c;都分析出来后就可以编写脚本将题目的opcode转化位vm实际执行的指令 &#xff1a;分析完成函数功能后就可以编写脚本输出…