Pointnet3D显示
1、运行show3d_ball出错
2、在运行PointNet的可视化程序时,作者只提供了linux平台下的动态链接库程序源码,自己的windows平台下无法调用。发现是动态链接库的文件格式不对,遂学习如何将.so文件转换成.dll文件(PS:前提是你有文件的.cpp源码)
3、第一步新建C++动态链接库项目
那现在我们的目的就很明显了,把cpp生成dll库,再用python调用这个库。在vs2019中,点击新建动态链接库(DLL)
创建完成之后,得到这四个文件:
pch.h 是写对外调用接口的地方,写下声明就好了,然后在pch.cpp中写实现就完成了。framework.h和dllmain.cpp先不用管。
pch.h添加声明:
// pch.h: 这是预编译标头文件。
// 下方列出的文件仅编译一次,提高了将来生成的生成性能。
// 这还将影响 IntelliSense 性能,包括代码完成和许多代码浏览功能。
// 但是,如果此处列出的文件中的任何一个在生成之间有更新,它们全部都将被重新编译。
// 请勿在此处添加要频繁更新的文件,这将使得性能优势无效。#ifndef PCH_H
#define PCH_H// 添加要在此处预编译的标头
#include "framework.h"
extern "C" _declspec(dllimport) void render_ball(int h, int w, unsigned char* show, int n, int* xyzs, float* c0, float* c1, float* c2, int r);
#endif //PCH_H
其中render_ball就是外部调用的方法。那问题来了,怎么知道是这个方法的呢?其实就是打开 visualizer下面的render_balls_so.cpp中的文件看到的哈。把里面的内容复制到pch.cpp中
// pch.cpp: 与预编译标头对应的源文件#include "pch.h"// 当使用预编译的头时,需要使用此源文件,编译才能成功。
#include <cstdio>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;struct PointInfo {int x, y, z;float r, g, b;
};void render_ball(int h, int w, unsigned char* show, int n, int* xyzs, float* c0, float* c1, float* c2, int r) {r = max(r, 1);vector<int> depth(h * w, -2100000000);vector<PointInfo> pattern;for (int dx = -r; dx <= r; dx++)for (int dy = -r; dy <= r; dy++)if (dx * dx + dy * dy < r * r) {double dz = sqrt(double(r * r - dx * dx - dy * dy));PointInfo pinfo;pinfo.x = dx;pinfo.y = dy;pinfo.z = dz;pinfo.r = dz / r;pinfo.g = dz / r;pinfo.b = dz / r;pattern.push_back(pinfo);}double zmin = 0, zmax = 0;for (int i = 0; i < n; i++) {if (i == 0) {zmin = xyzs[i * 3 + 2] - r;zmax = xyzs[i * 3 + 2] + r;}else {zmin = min(zmin, double(xyzs[i * 3 + 2] - r));zmax = max(zmax, double(xyzs[i * 3 + 2] + r));}}for (int i = 0; i < n; i++) {int x = xyzs[i * 3 + 0], y = xyzs[i * 3 + 1], z = xyzs[i * 3 + 2];for (int j = 0; j<int(pattern.size()); j++) {int x2 = x + pattern[j].x;int y2 = y + pattern[j].y;int z2 = z + pattern[j].z;if (!(x2 < 0 || x2 >= h || y2 < 0 || y2 >= w) && depth[x2 * w + y2] < z2) {depth[x2 * w + y2] = z2;double intensity = min(1.0, (z2 - zmin) / (zmax - zmin) * 0.7 + 0.3);show[(x2 * w + y2) * 3 + 0] = pattern[j].b * c2[i] * intensity;show[(x2 * w + y2) * 3 + 1] = pattern[j].g * c0[i] * intensity;show[(x2 * w + y2) * 3 + 2] = pattern[j].r * c1[i] * intensity;}}}}
注意把源文件中的extern “C”{}去掉,以免重复。
准备好了pch.h和pch.cpp,就可以生成了。不过在此之前要查看一下python解释器的平台是32bit还是64bit,因为64bit只能调用64bit的DLL,32bit只能调用32bit的DLL。
查看python解释器平台
import platform
print(platform.architecture()) #Output: ('64bit', 'WindowsPE')
那生成解决方案时选用x64
运行可能会报错,不影响最后获得dll文件
将render_ball.dll文件复制到visualizer
更新dll
'''dll = np.ctypeslib.load_library(os.path.join(BASE_DIR, 'render_balls_so'), '.')'''
dll = CDLL("./render_ball.dll")
再次运行show_3dballs.py,,成功显示
来源:公众号机器人视觉
Pointnet3D显示相关推荐
- ORACLE-SQL笔记
-- 首先,以超级管理员的身份登录oracle <span id="172_nwp" style="width: auto; height: auto; float ...
- Android开发从入门到精通
Android开发从入门到精通 --Android经典教程 目 录 目 录 1 第一章 什么是Android 1 什么是Android - 嵌入式设备编程的历史-第一章(1) 1 开放手机联盟和And ...
- java操作跨页的word cell,“excle如何打印不出现断行“EXCEL中,如何不跨页断行打印或显示,谢谢...
EXCEL中,如何不跨页断行打印或显示,谢谢 打印预览--页面设置--工作表--网格线(打勾) 试试! java导入excel 判断当前行有没有数据 工作中用到入excel一个方法,你还可以通过一些插 ...
- 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行
1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...
- Git 常用操作(3)- 本地分之显示、创建、切换、合并和删除操作
1. 分支简介 Git 的 "master" 分支并不是一个特殊分支.它就跟其它分支完全没有区别.之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创 ...
- Python+OpenCV 图像处理系列(1)— Ubuntu OpenCV安装、图片加载、显示和保存
Ubuntu 16.04 下安装 Opencv sudo apt-get install libopencv-dev sudo apt-get install python-opencv 或者使用 p ...
- Linux df -h 显示磁盘空间满,但实际未占用满——问题分析
问题现象 工作中遇到一个问题,在 TX2 系统上,告警提示磁盘空间不够,如图所示 wohu@wohu:/$ df -h Filesystem Size Used Avail Use% Mounted ...
- 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存
code 将下面文档存为load_display_save.py #-*- coding:utf-8 -*- from __future__ import print_function #1 impo ...
- Visual Studio 中文显示乱码问题
今天在码云上Fork了一个开源工程,编译环境是Visual Studio C++, 由于自己本地平台主要是进行Linux开发,平时文档编码格式都是utf-8的,编译没问题,但运行起来就是乱码,就像下图 ...
最新文章
- Eclipse中修改tomcat内存大小
- oracle 5632,Oracle系统默认临时表空间以及redo日志文件问题处理
- 关于项目中的日期提交
- 远程访问rest方式
- ASP.NET 3.5核心编程学习笔记(55):自定义扩展程序控件的创建
- LeetCode 10. 正则表达式匹配(递归/DP)
- 黑马程序员之SQL server基础学习笔记(三)
- Oracle分析函数、多维函数和Model函数简要说明,主要针对BI报表统计
- springboot 前缀_springboot搭配thymeleaf访问html页面的时候,什么时候需要自定义前缀和后缀呢...
- 面试题--------10、索引是什么,有什么作用和优缺点
- Js 获取屏幕坐标值
- opencv 图片缩放
- 拉结尔微信开到多少服务器了,拉结尔微信渠道服
- 四舍五入函数round_如何在R中使用round()将数字四舍五入
- 对计算机系相关人物进行访谈,瑶湖计算机系副主任姚华访谈录
- html_label标签
- 第三代人工智能基础设施背后,是一次技术应用的常识普及运动
- RBA认证培训,RBA验厂致力于改善企业的供应链
- 基于Linux的Spark安装与环境配置
- 达梦迁移oracle,达梦数据迁移工具的使用
热门文章
- c语言猜拳游戏实训报告,Java猜拳小游戏程序设计实验报告.doc
- Rendering Engine 主流的浏览器内核(排版引擎、渲染引擎、解释引擎)有哪几种,分别的特点...
- sitemap php 生成,php自动生成sitemap
- 走向未来 ——【中美青年领袖峰会】2018硅谷高创会首发
- QtCreator源码分析(三)——QtCreator源码结构分析
- Navicat Premium 免费
- Uber 正在成为美团外卖,滴滴还有多远?
- 多语种文字处理的得力助手——BabelPad
- 产品APP架构说明文档
- 手机的web页面调用相机拍照上传