【opencv基础】OpenCV使用Viz模块3D可视化显示

摘要:
codebunny.ply/***@filetransformations.cpp*@briefVisualizingcloudindifferentpositions,coordinateframes,camerafrustums*@authorOzanCagriTonkal*/#include#include#include˂fstream

code

bunny.ply

/**
 * @file transformations.cpp
 * @brief Visualizing cloud in different positions, coordinate frames, camera frustums
 * @author Ozan Cagri Tonkal
 */#include <opencv2/viz.hpp>#include <iostream>#include <fstream>
using namespace cv;
using namespace std;

/**
 * @function cvcloud_load
 * @brief load bunny.ply
 */static Mat cvcloud_load()
{
    size_t num = 188;  //1889.
    Mat cloud(1, num, CV_32FC3);
    ifstream ifs("../input/bunny.ply");

    stringstr;
    for(size_t i = 0; i < 12; ++i)
        getline(ifs, str);

    Point3f* data = cloud.ptr<cv::Point3f>();
    floatdummy1, dummy2;
    for(size_t i = 0; i < num; ++i)
    {
        ifs >> data[i].x >> data[i].y >> data[i].z >> dummy1 >>dummy2;
        std::cout << "i: " << i << "-x: " << data[i].x << "-y: " << data[i].y << "-z: " << data[i].z <<std::endl;
    }
    std::cout << "cloud: " << cloud <<std::endl;
    cloud *= 5.0f;
    std::cout << "cloud after: " << cloud <<std::endl;
    return cloud;
}
/**
 * @function main
 */
int main(int argn, char **argv)
{
    //Create a window
    viz::Viz3d myWindow("Coordinate Frame");
    //Create a cloud widget.
    Mat bunny_cloud =cvcloud_load();
    viz::WCloud cloud_widget(bunny_cloud, viz::Color::green());
    //Visualize widget
    myWindow.showWidget("bunny", cloud_widget);
    //Start event loop.
myWindow.spin();
    return 0;
}

Remark1:

Mat cloud(1, num, CV_32FC3);

不知道为什么使用CV_64FC3不能正常显示,改为CV_32FC3即可,但是官方文档定义的数据格式中包含有

cloud- Set of points which can be of type: CV_32FC3, CV_32FC4, CV_64FC3, CV_64FC4

Remark2:(filepath of bunny.ply after install opencv):

/opt/opencv-3.3.1/samples/cpp/tutorial_code/viz

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
set(CMAKE_CXX_COMPILER "g++")
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
list(APPEND CMAKE_CXX_FLAGS "-O3 -DEBUG -ffast-math -Wall -pthread -fopenmp -std=c++11") #-DNDEBUG
project(test_viz3d)
# OpenCV
find_package(OpenCV 3.3.1REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
message("OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}")
message("OpenCV_LIBS: ${OpenCV_LIBS}")
# VTK
find_package(VTK 5.10REQUIRED)
include(${VTK_USE_FILE})
message("VTK_USE_FILE: ${VTK_USE_FILE}")
message("VTK_LIBRARIES: ${VTK_LIBRARIES}")
# PROJECT
include_directories(include)
aux_source_directory(src DIR_SRCS)
add_executable(${PROJECT_NAME} ${DIR_SRCS})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${VTK_LIBRARIES})
View Code

Remarks3:如何保存图像呢?

博主使用saveScreenshot可以保存截图,png格式可以正常显示图片,jpg格式不能;而且需要在显示的循环外层才可以使用,否则出错;

Segmentation fault (core dumped)

可以使用getScreenshot得到屏幕截图的Mat数据,但是感觉数据不完整;

cv::Mat shot = myWindow.getScreenshot();
std::cout << "shot: " << shot.type() << "size: " << shot.size() << std::endl;

Output:

shot: 16size: [960 x 540]

opencv官方文档中没有找到代码实例。

intmain()
{
  double begin(0.0), end(0.0), cost(0.0);
  cv::viz::Viz3d window("Viz3D");
    Mat bunny_cloud =cvcloud_load();
  int cnt = 0;
  while(!window.wasStopped() && cnt<10)
  {
    cnt++;
    begin = (double)cv::getTickCount();
    viz::WCloud cloud_widget(bunny_cloud, viz::Color::green());
    window.showWidget("bunny", cloud_widget);
    end = (double)cv::getTickCount();
    cost = (end-begin)*1000/cv::getTickFrequency();
    std::cout << "showWidget cost(ms): " << cost <<std::endl;
    //cv::Mat shot = window.getScreenshot();
    //std::cout << "shot: " << shot.type() << "size: " << shot.size() << std::endl;
    window.spinOnce(1, true);
  }
  window.saveScreenshot("Viz3D_bunny.png");
  return 0;
}
View Code

Remark4:耗时分析

准备数据的运行时间并不长,大概2/3ms左右,但是spin/spinOnce函数的调用耗时很久,大概要40/50ms左右,需要使用openGL实现3D绘图解决耗时较久的问题。

参考

1.OpenCV 3D显示Viz模块

2. OpenCV编译安装viz3d模块_ubuntu

3. Opencv_contrib_viz_sample_transformation;

4.opencv - viz 画出SLAM轨迹;

免责声明:文章转载自《【opencv基础】OpenCV使用Viz模块3D可视化显示》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇sysbench对自装MySQL数据库进行基准测试遍历QMap引发异常处理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

nvidia tk1使用记录--基本环境搭建

前言   项目最开始是在X86+Nvidia(ubuntu+opencv+cuda)平台上实现,达到了期望性能,最近考虑将其移植到嵌入式平台,特别是最近nvidia出了tegra X1,基于和我们使用的gtx960相同的架构的gpu且是64位 8核心cpu,于是开始了尝试移植过程。当前TX1才出来,购买不是那么方便,于是拿它的前一代TK1进行一个最基本的评...

2020系统综合实践 第7次实践作业 11组

目录 1.在树莓派中安装opencv库 1.1 安装依赖 1.2 下载OpenCV源码 1.3 安装pip 1.4 安装Python虚拟机 1.5 编译OpenCV 1.6 安装OpenCV 2.使用opencv和python控制树莓派的摄像头 3.利用树莓派的摄像头实现人脸识别 facerec_on_raspberry_pi.py face...

C# Emgucv3.0的安装与配置

环境:vs2015+Emgucv3.0 Emgu Cv简介: Emgu CV是.NET平台下对OpenCV图像处理库的封装。也就是OpenCV的.NET版。它运行在.NET兼容的编程语言下调用OpenCV的函数,如C#、VB、VC++等。同时这个封装库可以在Mono下编译和在Linux / Mac OS X上运行。Emgu Cv的优势在于.net非常完美的...

python 调用 opencv 实现 图片文本倾斜校正

本项目为python项目需要安装python及python的opencv模块:opencv_python-4.0.1-cp37-cp37m-win32.whl 和 python的矩阵运算模块:numpy。        1、第一步,安装python3.7,具体安装步骤略。        2、第二步,使用pip安装python的矩阵运算模块:numpy。  ...

Android下OpenCV的环境搭建

目录(?)[-] 前言 系统环境 相关工具 Android ADT环境搭建 Android SDK环境变量的配置 Android NDK的安装与配置 OpenCV for Android 环境搭建 基于SDK的OpenCV开发 基于NDK的OpenCV开发 Android上层程序的编写 来自CODE的代码片 activity_mainxml...

基于WebGL的三维交通监控可视化技术应用(实践版) ThingJS

三维可视化##3D开发# WebGL, SVG,BIM技术对比 ThingJS整合Echarts数据分析 隧道监控三维可视化5大场景 互联网技术为交通行业的可视化带来了多样性的发展。从传统的二维平面变形图、二维SVG矢量图到如今的SVG三维矢量技术、BIM技术、GIS+BIM技术、 WebGL技术,甚至连AR、VR、MR等虚拟现实技术,也开始应用于交通领域...