树莓派编译OpenCV4

确保当前目录为 /home/opencv4/,确保树莓派可用所有内存(物理内存和虚拟内存)大于2GB

先看看有没有git,没有的话就

sudo apt install git

克隆项目:

git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git

速度比较慢的话可以挂个梯子或者使用码云

//基本操作软件源更新,软件包升级(注意版本)
sudo apt update
sudo apt upgrade

然后是安装各种包(缺少的话make的时候会提示)

sudo apt install libjpeg8-dev
sudo apt install libtiff5-dev
sudo apt install libjasper-dev
//sudo apt install libpng12-dev 这个和GTK2.0冲突
sudo apt install libavcodec-dev
sudo apt install libavformat-dev
sudo apt install libswscale-dev
sudo apt install libv4l-dev
sudo apt install libgtk2.0-dev

进入OpenCV项目目录

cd opencv

然后创建build文件夹,并进入

mkdir build
cd build

CMake

cmake \
   -D CMAKE_BUILD_TYPE=RELEASE \
   -D CMAKE_INSTALL_PREFIX=/usr/local \
   -D INSTALL_PYTHON_EXAMPLES=ON \
   -D OPENCV_EXTRA_MODULES_PATH=/home/opencv4/opencv_contrib/modules \
   -D BUILD_EXAMPLES=ON ..

开始编译(我这边是4核4GB内存的Pi4,所以直接开启4核编译,温馨提示:注意散热)

make -j4

编译完毕之后直接

sudo make install

遇到的树莓派蓝牙Serial的坑(RFCOMM)

第一次接触树莓派蓝牙,卡了好久,现在解决了,我就记录下来这些坑。

这边用NodeJS来做蓝牙的Server端,使用的是经典蓝牙,Python的话应该也是差不多的,毕竟就是读写串口。

首先是日常的安装依赖库

sudo apt install pi-bluetooth bluez bluez-firmware blueman

修改蓝牙的服务

sudo nano /etc/systemd/system/dbus-org.bluez.service

修改ExecStart,增加ExecStartPost,然后保存

ExecStart=/usr/lib/bluetooth/bluetoothd -C
ExecStartPost=/usr/bin/sdptool add SP

重启树莓派

NodeJS这边需要准备 serialport 库

npm install serialport

树莓派的蓝牙打开之后,手机的蓝牙串口工具可能没办法连接,这个时候需要监听蓝牙的hci0设备,如果没有其他串口,默认在/dev/rfcomm0,/dev/rfcomm0只有在有设备连接的时候才会自动创建,所以如果没有设备连接的时候打开串口会报错,需要做检测。

sudo rfcomm watch hci0

接下来就是代码了:


var SerialPort = require("serialport")
var bthServer = new SerialPort("/dev/rfcomm0",{
  baudRate:9600, //默认比特率为9600
  autoOpen:false, //是否自动开启,如果是的话下方的open函数就不需要了
}

bthServer.open(function(err){
  console.log("Is opened:",bthServer.isOpen)
  console.log("Error:",err) //如果有错误的话就开不了
}

bthServer.on("data",function(data){
  console.log(data) //输出蓝牙接收到的数据
  bthServer.write("Received") //往回发数据
}

8086汇编指令Wiki

数据传送指令

1.通用数据传送指令

指令含义中文描述
MOV Move 传送
PUSH Push onto the stack 进栈
POP Pop from the stack 出栈
XCHG Exchange 交换

2.累加器专用传送指令

指令含义中文描述
INInput 输入
OUTOutput 输出
XLATTranslate 换码

3.有效地址送寄存器指令

指令含义中文描述
LEALoad effective address有效地址送寄存器
LDSLoad DS with Pointer指针送寄存器和DS
LESLoad ES with Pointer指针送寄存器和ES

4.标志寄存器传送指令

指令含义中文描述
LAHFLoad AH with flags标志寄存器送进AH
SAHFStore AH into flagsAH 送进标志寄存器
PUSHFPush the flags标志进栈
POPFPop the flags标志出栈

算术指令

1.加法指令

指令含义中文描述
ADDAdd加法
ADCAdd with carry带进位加法
INCIncrement自加1

2.减法指令

指令含义中文描述
SUBSubtract减法
SBBSubtract with borrow带借位减法
DECDecrement自减1
NEGNegate求补
CMPCompare比较

3.乘法指令

指令含义中文描述
MULUnsigned Multiple无符号数乘法
IMULSigned Multiple带符号数乘法

4.除法指令

指令含义中文描述
DIVUnsigned divide无符号数除法
IDIVSigned divide带符号数除法
CBWConvert byte to word字节转换为字
CWDContert word to double word字转换为双字

逻辑指令

1.逻辑运算指令

指令含义中文描述
ANDAnd逻辑与
OROr逻辑或
NOTNot逻辑非
XORExclusive Or异或
TESTTest测试

2.移位指令

指令含义中文描述
SHLShift logical left逻辑左移
SALShift arithmetic left算术左移
SHRShift logical right逻辑右移
SARShift arithmetic right算术右移
ROLRotate left循环左移
RORRotate right循环右移
RCLRotate left through carry带进位循环左移
RCRRotate right through carry带进位循环右移

串处理指令

指令含义中文描述
MOVSMove string传送串
STOSStore string保存串
LODSLoad string加载串
CMPSCompare string比较串

控制转移指令

1.无条件转移指令

指令含义中文描述
JMPJump 无条件转移

2.条件转移指令

指令含义(转移条件)中文描述
JZ / JEJump if zero,
or equal
结果为零或相等
JNZ / JNEJump if not zero,
or not equal
结果不为零或不相等
JSJump if sign结果为负
JNSJump if not sign结果为正
JOJump if overflow溢出
JNOJump if not overflow不溢出
JP / JPEJump if parity,
or parity even
奇偶位为1
JNP / JPOJump if not parity,
or parity odd
奇偶位为0
JB / JNAE / JCJump if below,
or not above or equal,
or carry
低于,
或者不高于等于,
或进位位为1
JNB / JAE / JNCJump if not below,
or above or equal,
or not carry
不低于,
或者高于等于,
或进位位为0
JBE / JNAJump if below or equal,
or not above
低于等于,
或不高于
JNBE / JAJump if not below or equal,
or above
不低于等于,
或者高于
JL / LNGEJump if less,
or not greater or equal
带符号数小于,
或者不大于等于
JNL / JGEJump if not less,
or greater or equal
带符号数不小于,
或者大于等于
JLE / JNGJump if less or equal,
or not greater
带符号数小于等于,
或者不大于
JNLE / JGJump if not less or equal,
or greater
带符号数不小于等于,
或者大于
JCXZJump if CX register is zero CX寄存器的内容为零

3.循环指令

指令含义(循环条件)中文描述
LOOPLoop无条件
LOOPZ / LOOPELoop if zero当为零或相等时
LOOPNZ / LOOPNELoop if not zero当不为零或不相等时

4.子程序

指令含义中文描述
CALLCall调用指令
RETReturn返回指令

5.中断

指令含义中文描述
INTInterupt中断
INTOInterupt if overflow若溢出则中断
IRETReturn from interupt从中断返回指令

处理机控制指令

1.标志处理指令

指令含义中文描述
CLCClear carry进位位置0指令CF=0
CMCComplement carry进位位求反指令CF=Not CF
STCSet carry进位位置1指令CF=1
CLDClear direction方向标志置0指令DF=0
STDSet direction方向标志置1指令DF=1
CLIClear interrupt中断标志置0指令IF=0
STISet interrupt中断标志置1指令IF=1

2.其他处理机控制指令

指令含义中文描述
NOPNo Opreation无操作
HLTHalt停机
WAITWait等待
ESCEscape换码
LOCKLock封锁