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显示相关推荐

  1. ORACLE-SQL笔记

    -- 首先,以超级管理员的身份登录oracle <span id="172_nwp" style="width: auto; height: auto; float ...

  2. Android开发从入门到精通

    Android开发从入门到精通 --Android经典教程 目 录 目 录 1 第一章 什么是Android 1 什么是Android - 嵌入式设备编程的历史-第一章(1) 1 开放手机联盟和And ...

  3. java操作跨页的word cell,“excle如何打印不出现断行“EXCEL中,如何不跨页断行打印或显示,谢谢...

    EXCEL中,如何不跨页断行打印或显示,谢谢 打印预览--页面设置--工作表--网格线(打勾) 试试! java导入excel 判断当前行有没有数据 工作中用到入excel一个方法,你还可以通过一些插 ...

  4. 浅显易懂 Makefile 入门 (08)— 默认 shell (/bin/sh)、命令回显、make参数(-n 只显示命令但不执行,-s 禁止所有回显)、单行命令、多行命令、并发执行

    1. shell 相关 1.1 默认 shell Makefile 所使用的命令是由 shell 命令行组成,他们是一条一条执行的. 多个命令之间要使用分号隔开,Makefile 中的任何命令都要以 ...

  5. Git 常用操作(3)- 本地分之显示、创建、切换、合并和删除操作

    1. 分支简介 Git 的 "master" 分支并不是一个特殊分支.它就跟其它分支完全没有区别.之所以几乎每一个仓库都有 master 分支,是因为 git init 命令默认创 ...

  6. Python+OpenCV 图像处理系列(1)— Ubuntu OpenCV安装、图片加载、显示和保存

    Ubuntu 16.04 下安装 Opencv sudo apt-get install libopencv-dev sudo apt-get install python-opencv 或者使用 p ...

  7. Linux df -h 显示磁盘空间满,但实际未占用满——问题分析

    问题现象 工作中遇到一个问题,在 TX2 系统上,告警提示磁盘空间不够,如图所示 wohu@wohu:/$ df -h Filesystem Size Used Avail Use% Mounted ...

  8. 1 用python进行OpenCV实战之用OpenCV3实现图片载入、显示和储存

    code 将下面文档存为load_display_save.py #-*- coding:utf-8 -*- from __future__ import print_function #1 impo ...

  9. Visual Studio 中文显示乱码问题

    今天在码云上Fork了一个开源工程,编译环境是Visual Studio C++, 由于自己本地平台主要是进行Linux开发,平时文档编码格式都是utf-8的,编译没问题,但运行起来就是乱码,就像下图 ...

最新文章

  1. Eclipse中修改tomcat内存大小
  2. oracle 5632,Oracle系统默认临时表空间以及redo日志文件问题处理
  3. 关于项目中的日期提交
  4. 远程访问rest方式
  5. ASP.NET 3.5核心编程学习笔记(55):自定义扩展程序控件的创建
  6. LeetCode 10. 正则表达式匹配(递归/DP)
  7. 黑马程序员之SQL server基础学习笔记(三)
  8. Oracle分析函数、多维函数和Model函数简要说明,主要针对BI报表统计
  9. springboot 前缀_springboot搭配thymeleaf访问html页面的时候,什么时候需要自定义前缀和后缀呢...
  10. 面试题--------10、索引是什么,有什么作用和优缺点
  11. Js 获取屏幕坐标值
  12. opencv 图片缩放
  13. 拉结尔微信开到多少服务器了,拉结尔微信渠道服
  14. 四舍五入函数round_如何在R中使用round()将数字四舍五入
  15. 对计算机系相关人物进行访谈,瑶湖计算机系副主任姚华访谈录
  16. html_label标签
  17. 第三代人工智能基础设施背后,是一次技术应用的常识普及运动
  18. RBA认证培训,RBA验厂致力于改善企业的供应链
  19. 基于Linux的Spark安装与环境配置
  20. 达梦迁移oracle,达梦数据迁移工具的使用

热门文章

  1. c语言猜拳游戏实训报告,Java猜拳小游戏程序设计实验报告.doc
  2. Rendering Engine 主流的浏览器内核(排版引擎、渲染引擎、解释引擎)有哪几种,分别的特点...
  3. sitemap php 生成,php自动生成sitemap
  4. 走向未来 ——【中美青年领袖峰会】2018硅谷高创会首发
  5. QtCreator源码分析(三)——QtCreator源码结构分析
  6. Navicat Premium 免费
  7. Uber 正在成为美团外卖,滴滴还有多远?
  8. 多语种文字处理的得力助手——BabelPad
  9. 产品APP架构说明文档
  10. 手机的web页面调用相机拍照上传