在读学生自学Ubuntu20.04用C++调用matplotlib历程

Posted Witty_Hou

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在读学生自学Ubuntu20.04用C++调用matplotlib历程相关的知识,希望对你有一定的参考价值。

1.学习CMake

程序的编译需要用CMake,因此如果是Ubuntu小白的话,最好学一下。(小白的建议)

http://file.ncnynl.com/ros/CMake%20Practice.pdf

下载下来这篇文章,跟着里面的步骤从t1做到t4,并且自己适当扩展一下,因为后面我们所有需要用的东西都得依靠CMake。

这里是一个错误,需要将括号里的内容修改为hello $SRC_LIST

2.学习CMake编译C++文件

Ubuntu下Cmake编译C++程序Helloworld - HaijianYang - 博客园1、首选新建工程目录 mkdir helloworld 2、新建文件目录 cd helloworld mkdir bin mkdir lib mkdir src mkdir include mkdirhttps://www.cnblogs.com/haijian/p/12039160.html

https://blog.csdn.net/sunzhao1000/article/details/103293877https://blog.csdn.net/sunzhao1000/article/details/103293877

上面这篇文章里面介绍的东西相对来说比较详细,但是有一个问题就是,在Part A源码部分,并没有指明a.h这个文件应该怎么写,就会导致在编译的时候出现问题。如果你有兴趣自己研究怎么写,可以模仿博客园这篇文章,它给出了详细的过程。如果觉得太难了,我也会在后面的网盘连接里把我写的分享给大家。

第二篇文章的Part B引用的第三方库Opencv与后面的matplotlib应用关系密切,需要安装。

仿照第二篇文章最后的文件及结果:

 其中test.cpp文件

#include <iostream>
#include "a.h"
#include <opencv2/opencv.hpp>

#define NUM 100
int main()

	A obt;
    std::cout << NUM << std::endl;
    std::cout << "Hello World!" << std::endl;
    obt.a();
    
    cv::Mat img = cv::imread("/home/wenke/laopo.jpg");//括号里要填写自己图片保存的路径
    cv::namedWindow("老婆", 0);
    cv::resizeWindow("老婆",640,480);
    cv::imshow("老婆", img);
    cv::waitKey(0);
    cv::destroyAllWindows();
    return 0;

CMakeList.txt每条语句在上面的第二篇文章中都有解释,不清楚的请反复观看!

运行结果:

 

3.安装Opencv

OpenCV 在 Ubuntu 20.04 软件源中可用。想要安装它,运行:


sudo apt update
sudo apt install libopencv-dev python3-opencv

上面的命令将会安装所有必要的软件包,来运行 OpenCV:

通过导入cv2模块,并且打印 OpenCV 版本来验证安装结果:

python3 -c "import cv2; print(cv2.__version__)"

在写作的时候,软件源的版本是 4.2:

输出:4.2.0

4.检查Ubuntu的python版本

方法一:在/usr/lib目录下可以找到已经下载的各个版本的python

方法二:

5.安装python-pip

如何在 Ubuntu 20.04 上安装 Python Pip - ITCoder

如果有python3及其以上的版本,只安装为python3那部分就可以。

6.安装locate

安装方式:在终端输入

sudo apt install locate

locate指令可以便捷地查询各种文件的地址

例如:

 7.安装numpy和matplotlib

在Ubuntu上安装python3及numpy和matplotlib_WILDCHAP_的博客-CSDN博客

安装完成之后可以通过pip指令来查看库文件的位置:

8.下载c++调用matplotlib库时所需要的matplotcpp.h头文件

方法一:从github上下载,但是需要翻墙。

网址:

https://github.com/lava/matplotlib-cpp

方法二:如果你不会翻墙,我会把头文件给你放在网盘的链接里,自行下载。

9.使用matplotlibcpp.h绘制图形

编译我们会CMake进行,因此CMake是我们这些所有项目的基础,不会用的一定要去看看放在最开头的那个文档!

首先创建一个文件夹,内容为:

build是一个空文件夹,之后CMake编译的位置,用来放置编译文件和可执行文件。

CMakeList.txt内容:

cmake_minimum_required(VERSION 3.10)
project(mini CXX)

find_package(OpenCV REQUIRED)
include_directories($OpenCV_INCLUDE_DIRS)

set(CMAKE_CXX_STANDARD 11)
#指定库路径
file(GLOB_RECURSE Opencv3_LIB "/usr/lib/python3.8/config-x86_64-linux-gnu/*.so")
#指定头文件路径
set(Opencv4_INLCUDE_DIRS "/usr/include/python3.8")
#添加头文件到工程
include_directories(include $Opencv4_INLCUDE_DIRS)

# 通常这样设置就可以,如果你的项目包含qrc文件,那么需要将它们单独添加进来
aux_source_directory(. DIRS_SRCS)

add_executable(mini $DIRS_SRCS)
#添加库文件到工程
target_link_libraries(mini $Opencv_LIB)
target_link_libraries(mini libpython3.8.so)

 其中可能会遇到的几个问题:

(1)如果你安装了matplotlib,但项目中没有放置matplotlibpp.h头文件和需要编译的cpp文件在统一目录,或者在CMakeList.txt没有用include_directories(头文件位置)来指明matplotlibpp.h的位置,那么会出现matplotlibpp.h不存在的问题

(2)如果你没有安装numpy库,在你运行的时候,就算你引用了matplotlibpp.h,但是编译时会出现matplotlibpp.h中的第20行头文件#  include <numpy/arrayobject.h>不存在。

解决方法:set(Opencv4_INLCUDE_DIRS "/usr/include/python3.8")因为我的python3.8文件中有numpy头文件库,如果你的python3.8中没有,你可以新打开一个终端输入:

locate numpy

找到这个文件夹所在的位置,或者输入

pip show numpy

如图下半部分:

location:/usr/lib/python3/dist-packages 

 (3)报错显示:

很多很多很多这样类似的语句

/__multiarray_api.h:1451: undefined reference toPyImport_ImportModule’
/usr/include/python3.5/numpy/__multiarray_api.h:1455: undefined reference to PyExc_ImportError' /usr/include/python3.5/numpy/__multiarray_api.h:1455: undefined reference toPyExc_ImportError’
/usr/include/python3.5/numpy/__multiarray_api.h:1455: undefined reference to PyErr_SetString' /usr/include/python3.5/numpy/__multiarray_api.h:1458: undefined reference toPyObject_GetAttrString’
/usr/include/python3.5/numpy/__multiarray_api.h:1461: undefined reference to PyExc_AttributeError' /usr/include/python3.5/numpy/__multiarray_api.h:1461: undefined reference toPyExc_AttributeError’
/usr/include/python3.5/numpy/__multiarray_api.h:1461: undefined reference to PyErr_SetString' /usr/include/python3.5/numpy/__multiarray_api.h:1466: undefined reference toPyCapsule_Type’
/usr/include/python3.5/numpy/__multiarray_api.h:1466: undefined reference to PyCapsule_Type' /usr/include/python3.5/numpy/__multiarray_api.h:1467: undefined reference toPyExc_RuntimeError’
/usr/include/python3.5/numpy/__multiarray_api.h:1467: undefined reference to PyExc_RuntimeError' /usr/include/python3.5/numpy/__multiarray_api.h:1467: undefined reference toPyErr_SetString’
/usr/include/python3.5/numpy/__multiarray_api.h:1471: undefined reference to PyCapsule_GetPointer' /usr/include/python3.5/numpy/__multiarray_api.h:1482: undefined reference toPyExc_RuntimeError’
/usr/include/python3.5/numpy/__multiarray_api.h:1482: undefined reference to PyExc_RuntimeError' /usr/include/python3.5/numpy/__multiarray_api.h:1482: undefined reference toPyErr_SetString’

原因:没有链接python库

解决方法:

target_link_libraries(mini libpython3.8.so)

(4)报错:

ModuleNotFoundError: No module named 'matplotlib.pyplot'

原因:matplotlib库出错或者没有下载

解决方法:重新下载matplotlib库

mini.cpp内容:

#include "matplotlibcpp.h"
#include <vector>

namespace plt = matplotlibcpp;

int main() 
  std::vector<double> y = 1, 3, 2, 4;
  plt::plot(y);
  plt::show();

(5)Opencv相关问题

原因:Openc后的数字出现问题,下载的版本与写的不一致

解决方法:这个不敢保证,因为我在运行时没有遇到,但是可能会出现。如果你不知道自己Opencv的版本是多少,可以直接删除数字,我测试过,在我的电脑上可以运行。

如果你想知道opencv版本,可以通过

locate opencv

 查看可以找到版本:4.2

如果觉得不会引用matplotlibcpp.h文件,直接把它和头文件放置在同一个目录下即可。

文件都准备完毕后,按照CMake的顺序,build目录打开终端

cmake .(.前有一个空格)(也可以有两个.)

make

./mini(./你生成的可执行文件名)

运行结果:

 如果遇到其他问题,可以留言评论中提出来,或者可以添加我的QQ:3122899873

10.资料链接🔗

链接: https://pan.baidu.com/s/1vf0YJ9mDqCoLRcz02qBdyw 提取码: 8nu1

文件中我已经把我自己编译过的build删除了,并放置了一个空的build,因为CMakeList.txt中路径可能不一样,你直接运行不一定可行。并且就算路径相同也可能会遇到CMakeList.txt文件报错,如果遇到,解决方法就将build之外的所有文件复制到一个新的文件夹,新建一个build,重新编译。

以上是关于在读学生自学Ubuntu20.04用C++调用matplotlib历程的主要内容,如果未能解决你的问题,请参考以下文章

记录ubuntu20.04成功编译安装opencv4 c++环境

记录ubuntu20.04成功编译安装opencv4 c++环境

Ubuntu20.04设置静态IP(/etc/netplan添加yaml配置)

Ubuntu 20.04下搭建C++ & OpenCV 4.6.0 & cmake编译

自学编程需要注意什么?

sleep()函数在Ubuntu 20.04+WSL1不起作用