【opencv基础】OpenCV使用Viz模块3D可视化显示
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"); string str; for(size_t i = 0; i < 12; ++i) getline(ifs, str); Point3f* data = cloud.ptr<cv::Point3f>(); float dummy1, 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.1 REQUIRED) include_directories(${OpenCV_INCLUDE_DIRS}) message("OpenCV_INCLUDE_DIRS: ${OpenCV_INCLUDE_DIRS}") message("OpenCV_LIBS: ${OpenCV_LIBS}") # VTK find_package(VTK 5.10 REQUIRED) 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})
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官方文档中没有找到代码实例。

int main() { 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; }
Remark4:耗时分析
准备数据的运行时间并不长,大概2/3ms左右,但是spin/spinOnce函数的调用耗时很久,大概要40/50ms左右,需要使用openGL实现3D绘图解决耗时较久的问题。
参考
1. OpenCV 3D显示Viz模块;
3. Opencv_contrib_viz_sample_transformation;
完
各美其美,美美与共,不和他人作比较,不对他人有期待,不批判他人,不钻牛角尖。
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
心正意诚,做自己该做的事情,做自己喜欢做的事情,安静做一枚有思想的技术媛。
版权声明,转载请注明出处:https://www.cnblogs.com/happyamyhope/
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
2019-03-13 【leetcode】448. Find All Numbers Disappeared in an Array
2019-03-13 【环境搭建与软件安装】nvidia驱动安装事宜