A311D用工业相机APP获取raw图像并做各种格式转换
目录
主要涉及的知识点有: 2
RAW 图格式转换(主要意义) 2
Android 通用串口通信,及usb转串口通信 2
1先创建android_serialport_api包 2
2创建jni 2
3设置环境编译生成so 3
4实现操作类 4
5数据发送格式 5
Android studio 各种环境准备,及Android 各种控件使用,android 的调试方法 5
Android JNI 开发 5
ENVI 数据生成方法 5
ENVI打开生成的dat文件报错 5
导入 txt文件,及调用文件浏览器来打开相关文件,java层打开txt,及c++打开txt 5
android9获取sd卡权限失败 5
报错没有使用命名空间 6
python初涉 6
解读python 6
1下载python 7
2测试python 7
3添加环境变量 8
4测试 8
手机调用PFPI 出现问题及打开工业相机方法 9
demo使用说明: 9
存在问题及优缺点: 11
概述:
A311D(Android 9.1) + 迈德威视工业相机+ PFPI 模块,Android APP demo 项目开始时间是2020年1月07号,到今天2020年3月16日星期一,总共用时 6 个星期—— 一个半月,APP开发从小白到现在的一点点入门,还是非常有意义的
主要涉及的知识点有:
RAW 图格式转换(主要意义)
首先要根据文档,添加代码打印看相机有支持哪些数据格式先,利用打断点进行调试,可以一步步查看每个值是多少,然后计算得到数据格式
1.使用api 拍 raw 图,
2.获取到pRawData之后,一行一行的写
其中要好好分析写过程是否正确
Android 通用串口通信,及usb转串口通信
1先创建android_serialport_api包
在 MainActivity.java 同级 下 new package
就会产生一个 android_serialport_api 的目录
然后就 把 从 google 下载的 api
去Github上下载google-Serailport-api的源码,下载地址:Google-Serailport-api
下载下来以后
把
SerialPort.java 和 SerialPortFinder.java 给拷贝到 新建的 包里准备用来调用 jni 使用
2创建jni
在与 java 同级下创建 jni 目录
然后把从 去Github上下载google-Serailport-api的源码,下载地址:Google-Serailport-api
下载下来以后
把 jni 中的 文件全部拷贝过来
目的就是要用来生成 相关的 so
3设置环境编译生成so
首先要 安装 NDK
然后了解 JNI 是什么
还有就是 so 文件
详细请看 https://blog.csdn.net/u010976213/article/details/50816956
- 先安装 NDK 点击 tools 进入 SDK Tools
确认 NDK 下载好,然后 配置 环境变量 ,测试是否安装成功
cmd 命令 使用 ndk-build 来看是否可以使用
- 生成 so 库 https://blog.csdn.net/weixin_42676203/article/details/81561501
2.1 生成相关的 .h .c .mk 文件步骤略过,我们直接拷贝使用 google 下载的 文件,拷贝过来
2.2 然后生成 so 文件
a
首先创建一个 java 文件,使用
static {
System.loadLibrary(“serial_port”);
}
来装载 so ,因为拷贝的 google 文件中的 SerialPort.java 中已经有,就可以了
b
配置 gradle
在 app 下的 build.gradle 中添加
ndk {
// 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
abiFilters "armeabi-v7a"
//abiFilters "arm64-v8a"
//abiFilters "x86"
//abiFilters "x86_64"
}
sourceSets {
main{
jni.srcDirs = [] // 这个一定要加上,就不会自动编译 ,使用的就是我们自己的 mk文件了
jniLibs.srcDirs 'src/main/libs'
// jniLibs.srcDirs = ['libs']
}
}
buildTypes {
c
终端 进入工程的app\src\main 目录下,输入 ndk-build
然后报错
E:\android_studio_project\serialport\app\src\main>ndk-build
Android NDK: APP_PLATFORM not set. Defaulting to minimum supported version android-16.
就把 mk文件支持的版本降低
说明
Application.mk设置的ndk版本与使用的ndk版本不一致
解决方案
在Application.mk中添加或修改: 低版本的
APP_PLATFORM := android-14
APP_ABI := all
然后在终端使用 ndk-build 编译生成 so
ndk-build clean
4实现操作类
在 MainActivity.java 同级新建 类
GoogleSerialPortUtils 类名随便取
主要功能就是 打开 串口 、发送数据、接收数据、关闭串口 4个方法
然后接收数据使用线程功能
5数据发送格式
就是要解读我们的PFPI 模块的控制方式
Android studio 各种环境准备,及Android 各种控件使用,android 的调试方法
Android JNI 开发
ENVI 数据生成方法
ENVI打开生成的dat文件报错
Bands 数不一致 或者就是 wavelength 格式有问题 还有就是 fwhm 没有
ENVI 的dat 生成直接使用追加方式打开复制 Buffer进去就行
导入 txt文件,及调用文件浏览器来打开相关文件,java层打开txt,及c++打开txt
android9获取sd卡权限失败
https://blog.csdn.net/PlainWaterh/article/details/78341971
android6 之后 需要动态获取权限
报错没有使用命名空间
note: ‘std::ifstream’ declared here
using namespace std;
https://www.cnblogs.com/JCSU/articles/1190685.html
**
python初涉
**
解读python
def setSetpoint(self, setpoint1):
'''Set PFPI setpoint1 in hardware controller.
Returns False if value of setpoint1 is outside of valid range.'''
self._check_port()
self._check_config()
if not (self._config['min_sp1']<=setpoint1<=self._config['max_sp1']):
return False
setpoints = self._computeSetpoints(setpoint1)
adu = [int(round(x/2.5*65535)) for x in setpoints]
s = ','.join([str(a) for a in adu])
cmd = 'h' + s + '\r\n'
#print(cmd)
self._port.write(str.encode(cmd))
return True
def _computeSetpoints(self, setpoint1):
'''Create 3-tuple of setpoint values from setpoint1'''
return [setpoint1,
self._polyval(self._config['piezo2'], setpoint1),
self._polyval(self._config['piezo3'], setpoint1)]
def _polyval(self, p, x):
'''Evaluate polynomial p at x'''
a = 0.
for i in range(len(p)):
a = a*x + p[i]
return a
我们模块枚举情况
[ 36.606666@0] usb 1-1.1: new full-speed USB device number 4 using xhci-hcd
[ 36.772520@0] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device
设别成 虚拟 设备
虚拟的串行口
Bus 001 Device 013: ID 1fc9:0083
1下载python
2.7版本
并添加环境变量 才可以使用 cmd
或者 直接运行 exe 文件
C:\Users\Admin\Desktop\Python27>python.exe
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
或者自己打开 python 先
2测试python
Python 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:53:40) [MSC v.1500 64 bit (AMD64)] on win32
Type “help”, “copyright”, “credits” or “license” for more information.
print(“Hello Python”);
Hello Python
就说明可以的
3添加环境变量
https://www.runoob.com/python/python-install.html
命令行模式添加
C:\Users\Admin>path=%path%;C:\Python27
然后就可以使用环境变量 使用了 cmd 即可
C:\Users\Admin\Desktop\Driver_Adv>pip install configparser pyserial
‘pip’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。
同样也是要添加环境变量
去添加对应的环境变量:C:\ Program Files \ Python36 \ Scripts到Path环境变量中去,因为改路径中包含了对应的PIP程序,所以这样就轻松的可以解决PIP无法运行的问题了右键点击:此电脑- >属性- >高级系统设置- >高级- >环境变量- >路径- >修改,添加成功以后就可以运行了
然后 cmd 使用 pip -h
即可
4测试
C:\Users\Admin\Desktop\Driver_Adv>pfpi_example.py
Simple PFPI control script
========================================================
Opened config file.
Enter COM port number of device and press [ENTER]: COM4
Opened serial port COM4
Hardware ID: 18025025 AF080901 588562BD F5001985
Enter 'q' and [ENTER] to exit application.
Enter a valid setpoint and press [ENTER]: 0.6
Setpoint set to: 0.6.
Enter a valid setpoint and press [ENTER]: 0.56
Setpoint set to: 0.56.
手机调用PFPI 出现问题及打开工业相机方法
- 修改 ttyACM0 权限
[ 753.647816@0] usb 1-1.1: new full-speed USB device number 5 using xhci-hcd
[ 753.793019@0] cdc_acm 1-1.1:1.0: ttyACM0: USB ACM device
- 通过 调用 usb 设备
./sys/bus/usb/drivers/cdc_acm
- 参考 usb serial 方式,直接读取 PID VID 方式
console:/ # lsusb
Bus 001 Device 005: ID 1fc9:0083
console:/sys/bus/usb/drivers/usb/1-1.1 #
cat idVendor ;cat idProduct <
1fc9
0083
demo使用说明:
首先要准备两个文档,Exp.txt 和 PFPI 的波段值列表 PFPI_.txt,Exp.txt 复制到指定/sdcard/目录下,也就是内部存储的根目录下, PFPI_.txt就可以随意放置,因为这个是后面通过自己选择来指定路径的
首先工业相机接到 USB3.0口,PFPI模块可以任意USB口,然后确认 A311D 底部没有短路(不接触导电材料),使用华为手机充电器及数据线给板子供电,供电不足请外接hub给工业相机供电,确保有两类txt文件及两个模块连接正常,A311D开启后,点击 nano app,开启我们的demo,
1.先点击 《请选择文件~》选择我们的 PFPI ***.txt 加载配置,可以点击查看内容查看值,可以上下滚动查看全部值,想要某一固定值,可以通过输入控制 PFPI
2.预览正常后,点击 拍_ENVI
3.最后可以看到在内存空间根目录下有相关的 EVNI 文件及对应每一张raw图
存在问题及优缺点: