开发环境:Unbuntu 18.04 LTS + ROS Melodic + ViSP 3.3.1
文章内容主要参考ViSP官方教学文档:https://visp-doc.inria.fr/doxygen/visp-daily/tutorial_mainpage.html

 本文主要介绍了如何使用vpImageDraw类中定义的函数来绘制一张图片,并使用vpImageIo类中定义的函数来保存一张图片。下文借鉴了testImageDraw.cpp测试例程中的部分内容,但并不完全相同。首先,我们先要新建一个Visp工程(可以参考这篇博客ViSP学习笔记(三):新建Visp工程并使用CMake完成编译)
cd $VISP_WS
mkdir started
cd started
touch tutorial-image-draw.cpp
gedit tutorial-image-draw.cpp

 在打开的文件中添加以下代码

#include <visp3/gui/vpDisplayGDI.h>
#include <visp3/gui/vpDisplayX.h>
#include <visp3/core/vpImageDraw.h> // 添加ImageDraw头文件,其中包含图像绘制相关的类
#include <visp3/core/vpFont.h> // 添加Font头文件,其中包含字体文本相关的类
#include <visp3/io/vpImageIo.h> // 添加ImageIO头文件,其中包含图像输入输出相关的类
int main()
{
  vpImage<vpRGBa> I(480,640); // 创建一个大小为640*480的RGBa格式的图像I

  try {
#if defined(VISP_HAVE_X11)
    vpDisplayX d(I);
#elif defined(VISP_HAVE_GDI)
    vpDisplayGDI d(I);
#endif
    vpImagePoint ip1(100, 200); //定义点ip1在图像(200,100)位置处
    vpImagePoint ip2(300, 400); //定义点ip2在图像(400,300)位置处
    vpImageDraw::drawLine(I, ip1, ip2, vpColor::orange, 3); 
    // 在图像I上连接ip1和ip2两点绘制一条桔黄色的直线

    vpImagePoint ip3(100, 200); //定义点ip3在图像(200,100)位置处
    vpImageDraw::drawCircle(I, ip3, 80, vpColor::green, 3); 
    //在图像I上以ip3点为圆心,以80为半径绘制一个绿色的圆

    vpImagePoint ip4(100, 400); //定义点ip4在图像(400,100)位置处
    int w = 150; //定义w为150
    int h = 80; //定义h为80
    vpImageDraw::drawRectangle(I, vpRect(ip4, w, h), vpColor::yellow, false, 3);
    //在图像I上以ip4点为左上角端点,以w为长,h为宽绘制一个黄色的矩形
    
    vpImagePoint ip5(200, 200); //定义点ip5在图像(200,200)位置处
    vpImageDraw::drawCross(I, ip5, 15, vpColor::blue, 1);
    //在图像I上以ip5点为中心绘制一个蓝色的十字形
    
    vpImagePoint ip6(200, 400);     //定义点ip6在图像(400,200)位置处
    vpFont font(32); // 定义一个高度为32的字体实例
    font.drawText(I, "Test...", ip6, vpColor::white, vpColor::black);
    // 在图像I上以ip6点为左上角端点,绘制一个黑底白字的文本框,文字内容为"Test..."
    
    vpDisplay::setTitle(I, "My image");
    vpDisplay::display(I);
    vpDisplay::flush(I);
    std::cout << "A click to quit..." << std::endl;
    vpDisplay::getClick(I);
    std::string filename = "canvas_color.png"; //定义要保存文件的名字
    std::cout << "Save " << filename << std::endl; 
    vpImageIo::write(I, filename); // 把绘制的图像写入文件中保存
  } catch (const vpException &e) {
    std::cout << "Catch an exception: " << e.getMessage() << std::endl;
  }
}

 新建CMakeLists.txt文件

touch CMakeLists.txt
gedit CMakeLists.txt

在打开的文件中写入以下代码

project(tutorial-image)

cmake_minimum_required(VERSION 2.8.12.2)

find_package(VISP REQUIRED visp_core visp_io visp_gui)

set(tutorial_cpp
  tutorial-image-draw.cpp
 )

foreach(cpp ${tutorial_cpp})
  visp_add_target(${cpp})
  if(COMMAND visp_add_dependency)
    visp_add_dependency(${cpp} "tutorials")
  endif()
endforeach()

  新建build文件夹(如果已经有了,无需重复新建),进入文件夹并完成工程配置

mkdir build
cd build
ccmake .. -DCMAKE_BUILD_TYPE=Release

点击两次“c”键和一次“g”键,生成Makefile文件。编译工程并执行程序

make
./tutorial-image-draw

 结果如下图所示,并且在build文件夹中会生成一个名为canvas_color.png的图片文件。

在这里插入图片描述

如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。

在这里插入图片描述