milk-v duo 扩展 / 空间的方法

milk-v duo 的官方镜像写入的 / 空间只有几百M,而我的sd 卡却有16G 的空间,这样就有13G 左右的空间闲置了,经过实测和多翻尝试,使用下面的方法可以扩展 / 空间。

1、把sd 卡插到一个读卡器上,然后用一个LINUX 系统读出,我用的是ubuntu 20.04

2、运行 lsblk 查看sd卡的名称

NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda      8:0    0 931.5G  0 disk 
(snip! a lot of extra junk was here)
sdf      8:80   1     0B  0 disk 
sdg      8:96   1 16.1G  0 disk <---- 我的SD卡
├─sdg1   8:97   1   128M  0 part 
├─sdg2   8:98   1   768M  0 part 
└─sdg3   8:99   1   256M  0 part 

运行 fdisk /dev/sdg 修改分区

Command (m for help): d
Partition number (1-3, default 3): 2

Partition 2 has been deleted.

Command (m for help): d
Partition number (1,3, default 3): 3

Partition 3 has been deleted.

Command (m for help):

删除旧的分区

Command (m for help): n
Partition type
   p   primary (1 primary, 0 extended, 3 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (2-4, default 2): 2
First sector (262145-250347519, default 264192): 262145
Last sector, +/-sectors or +/-size{K,M,G,T,P} (262145-250347519, default 250347519): +12G 

Created a new partition 2 of type 'Linux' and of size 12 GiB.
Partition #2 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o:N  <-----是否移除签名,选N

保险起建,选一下分区类型

Command (m for help): t
Partition number (1,2, default 2): 2
Hex code or alias (type L to list all): 83

Changed type of partition 'Linux' to 'Linux'.

最后保存

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

运行 e2fsck -f /dev/sdg2 检查一下

e2fsck 1.46.5 (30-Dec-2021)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
rootfs: 4730/49152 files (0.6% non-contiguous), 180791/786432 blocks

最后运行 resize2fs /dev/sdg2 调整容量

resize2fs 1.46.5 (30-Dec-2021)
Resizing the filesystem on /dev/sdg2 to 125042684 (1k) blocks.
The filesystem on /dev/sdg2 is now 125042684 (1k) blocks long.

这个调整容量可能会很久,需要准备充足的时间。完成后就可以了。

c++ opencv 的 MOG2 算法参数定义和停止回归训练的方法

Ptr<BackgroundSubtractorMOG2> bgsubtractor = createBackgroundSubtractorMOG2();

// 用于训练背景的帧数,如果不手动设置learning rate,history就被用于计算当前的learning rate,
// history越大,learning rate越低,背景更新越慢
bgsubtractor->setHistory(500);

// 方差阈值,主要用于判断前景还是背景,值越大,灵敏度越低
// 如果光照变化明显,如阳光下的水面,建议设为25,36
bgsubtractor->setVarThreshold(16);

// 是否检测有影子,开启后会增加算法复杂度
bgsubtractor->setDetectShadows(true);

// 高斯模型个数,默认5个,最多8个
bgsubtractor->setBackgroundRatio(4);

// 高斯背景模型权重和阈值,nmixtures个模型按权重重排序后,
// 只取模型权重累加值大于backgroundRatio的前几个作为背景模型
bgsubtractor->setNMixtures(5);

// 新建高斯模型的方差初始值,默认15
bgsubtractor->setVarInit(15);

// 背景更新时,用于限制高斯模型方差的最大值,默认20
bgsubtractor->setVarMax(20);

// 背景更新时,用于限制高斯模型方差的最小值,默认4
bgsubtractor->setVarMin(4);

// 方差阈值,用于已经存在的匹配的模型,如果不存在则新建一个
bgsubtractor->setVarThresholdGen(100);

 

PS:实际使用时发现指针实例的算法模型并没有以上的函数去设置这些参数细节(opencv 版本 4.5.2)查阅了opencv的官方在线文档后,发现这些参数在c++版本中均为virtual 的函数方法。实际效果我并没有一一调用尝试,只是修改了指针实例化时可传入的 History,Threshold和shadowDetect 三个参数。实际使用中,感觉把History 参数和 Threshold 调大一些会比默认的参数好一些。

关于实际使用时的目标融入背景问题。参阅了多个国内外关于物品遗留的专利和论文,里面大致都会提到使用帧对比或者快、慢速建模的方法,并提到了用此方法可以避免前景目标融入背景,具体做法专利和论文均没有详细提及,有的只是画了一个简单的流程图,后经我查阅了OPENCV的官方文档和研究MOG2 算法处理的原理,得出只要在一开始对背景建模后,可以用一种方法让MOG2模型的训练停止,从而使其只是作推理计算而不作模型更新的办法,这样前景目标就可以不融入背景。具体方法就是在调用apply函数时,同时传入学习率参数,当训练到某程度时,把学习率设为0即可让模型停止更新。同理,只要把学习率设为1 周可以整体刷新模型让其重新学习。

cv::freetype 在windows 的中文乱码问题

在windows 的vs 环境中默认使用的是带BOM的UTF,但即使在保存源代码文件时选 了UTF8 ,编译后同样还是会乱码。经再三研究后,发现需在工程文件的属性-》C/C++  -》命令行中加入%(AdditionalOptions) /source-charset:utf-8 /execution-charset:utf-8

加入后重新编译就可以了

 

Build opencv with gstreamer

因为从pip 下载的公开仓库的 opencv-python 并不包含 gstreamer 的调用,所以要使用opencv  + gstreamer 需要自行build opencv 并把 gstreamer build 进去。

编译方法如下:

安装gstreamer

sudo apt-get install gstreamer1.0*

sudo apt install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev

编译opencv

mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=RELEASE \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D INSTALL_C_EXAMPLES=OFF \
-D PYTHON_EXECUTABLE=$(which python3) \
-D BUILD_opencv_python2=OFF \
-D CMAKE_INSTALL_PREFIX=$(python3 -c “import sys; print(sys.prefix)”) \
-D PYTHON3_EXECUTABLE=$(which python3) \
-D PYTHON3_INCLUDE_DIR=$(python3 -c “from distutils.sysconfig import get_python_inc; print(get_python_inc())”) \
-D PYTHON3_PACKAGES_PATH=$(python3 -c “from distutils.sysconfig import get_python_lib; print(get_python_lib())”) \
-D WITH_GSTREAMER=ON \
-D BUILD_EXAMPLES=ON ..

python 解析byte 到具体值

使用 struct.unpack(‘类型’,byte对象) 方法,可以轻松解析byte 到具体值。类型对应的字节长度和字符串如下表

Format C Type Python type Standard size Notes
x pad byte no value (7)
c char bytes of length 1 1
b signed char integer 1 (1), (2)
B unsigned char integer 1 (2)
? _Bool bool 1 (1)
h short integer 2 (2)
H unsigned short integer 2 (2)
i int integer 4 (2)
I unsigned int integer 4 (2)
l long integer 4 (2)
L unsigned long integer 4 (2)
q long long integer 8 (2)
Q unsigned long long integer 8 (2)
n ssize_t integer (3)
N size_t integer (3)
e (6) float 2 (4)
f float float 4 (4)
d double float 8 (4)
s char[] bytes (9)
p char[] bytes (8)
P void* integer (5)

cuda 12.x.x 在编译 darknet 时的问题和解决

cuda 12 开始不再支持compute_35 这么就造成如果使用这个或更高版本的cuda 时编译 darknet 不过的问题,并且,因为cuda 12 在编译安装后的库目录也做了一些改变,增加了 stubs 目录,在/usr/lib 目录里,部份.so 文件放在了这个目录里,这么就会造成 编译 darknet 时提示找不到 -lcuda 的问题。经过我多次尝试和网上查找相关资料,终于找到解决方法

1、修改 Makefile 找到

ARCH= -gencode arch=compute_35,code=sm_35

修改为 ARCH= -gencode arch=compute_75,code=sm_75

2、找到 -lcuda 指向的目录/usr/lib

修改为 /usr/lib/stubs

wsl2 上编译opencv 4.7.0 with cuda

cd opencv-4.7.0 && mkdir build

cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE -D WITH_CUDA=ON -D WITH_CUBLAS=ON -D WITH_CUDNN=ON -D WITH_LIBV4L=ON -D ENABLE_FAST_MATH=ON -D CUDA_FAST_MATH=ON -D OPENCV_DNN_CUDA=ON -D ENABLE_NEON=OFF -D WITH_OPENMP=ON -D WITH_OPENGL=OFF -D WITH_FFMPEG=ON -D WITH_TBB=ON -D BUILD_TBB=ON -D BUILD_TESTS=OFF -D BUILD_opencv_python3=ON -D BUILD_opencv_python2=OFF -D BUILD_opencv_java=OFF -D WITH_GTK=ON -D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF -D OPENCV_ENABLE_NONFREE=ON -DBUILD_OPENJPEG:BOOL=ON -D OPENCV_EXTRA_MODULES_PATH=/mnt/j/opencv_contrib-4.7.0/modules ..

make -j8 && sudo make install

wsl2 编译 opencv 4.7.0 的一个OpenJpeg的问题

这个问题我在wsl2 的 ubuntu20.04 中编译 opencv4.7.0 时遇到了,不清楚在别的wsl 和别的ubuntu 版本上有没有这个问题,最终问题也解决了,不知道别的wsl 环境有没有这个问题,先把解决方法记下了。

在编译时会出以下这样的错误

grfmt_jpeg2000_openjpeg.cpp:(.text._ZN2cv6detail20Jpeg2KOpjDecoderBase10readHeaderEv+0xa1): undefined reference to `opj_stream_set_user_data’
/usr/bin/ld: grfmt_jpeg2000_openjpeg.cpp:(.text._ZN2cv6detail20Jpeg2KOpjDecoderBase10readHeaderEv+0xb0): undefined reference to `opj_stream_set_user_data_length’
/usr/bin/ld: grfmt_jpeg2000_openjpeg.cpp:(.text._ZN2cv6detail20Jpeg2KOpjDecoderBase10readHeaderEv+0xbf): undefined reference to `opj_stream_set_read_function’
/usr/bin/ld: grfmt_jpeg2000_openjpeg.cpp:(.text._ZN2cv6detail20Jpeg2KOpjDecoderBase10readHeaderEv+0xce): undefined reference to `opj_stream_set_skip_function’
/usr/bin/ld: grfmt_jpeg2000_openjpeg.cpp:(.text._ZN2cv6detail20Jpeg2KOpjDecoderBase10readHeaderEv+0xdd): undefined reference to `opj_stream_set_seek_function’
/usr/bin/ld: grfmt_jpeg2000_openjpeg.cpp:(.text._ZN2cv6detail20Jpeg2KOpjDecoderBase10readHeaderEv+0xf5): undefined reference to `opj_stream_destroy’
/usr/bin/ld: grfmt_jpeg2000_openjpeg.cpp:(.text._ZN2cv6detail20Jpeg2KOpjDecoderBase10readHeaderEv+0x110): undefined reference to `opj_create_decompress’
/usr/bin/ld: grfmt_jpeg2000_openjpeg.cpp:(.text._ZN2cv6detail20Jpeg2KOpjDecoderBase10readHeaderEv+0x12e): undefined reference to `opj_destroy_codec’
/usr/bin/ld: grfmt_jpeg2000_openjpeg.cpp:(.text._ZN2cv6detail20Jpeg2KOpjDecoderBase10readHeaderEv+0x150): undefined reference to `opj_set_default_decoder_parameters’

从错误提示看,是找不到Jpeg2000 的某个引用的方法,但为什么找不到就不知道了,在网上一翻查找后,没找到说这个问题的,最后在一篇国外的关于wsl2 和 openjpeg  的文章找到了一丝解决方法,试了一下,最后终于解决了。原文的意思是jpeg2000 所使用的OpenJPEG 在wsl2 中已经包含了,但在编译时还是会提示找不到符号。可能是包含的库少了些什么,需要使用opencv 去编译自己的 openJpeg 所以,需要在cmake 中加入

-DBUILD_OPENJPEG:BOOL=ON 参数。

最后加入这个后,问题解决

WSL2 Ubuntu下安装cuda

顺序执行下面命令


wget https://developer.download.nvidia.com/compute/cuda/repos/wsl-ubuntu/x86_64/cuda-wsl-ubuntu.pin
sudo mv cuda-wsl-ubuntu.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.1.1/local_installers/cuda-repo-wsl-ubuntu-12-1-local_12.1.1-1_amd64.deb
sudo dpkg -i cuda-repo-wsl-ubuntu-12-1-local_12.1.1-1_amd64.deb
sudo cp /var/cuda-repo-wsl-ubuntu-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

编译ffmpeg 集成nvidia 硬解码模块

安装编译依赖
sudo apt install build-essential libclang-11-dev clang-11 clang-format-9 libssl-dev
更新包管理
sudo apt update
安装编译依赖
sudo apt install git libgtk2.0-dev pkg-config python3-scipy
下载硬解码头文件
git clone https://git.videolan.org/git/ffmpeg/nv-codec-headers.git

cd nv-codec-headers/
安装硬解码头文件
sudo make install && cd -
安装ffplay 依赖
sudo apt install libsdl2-dev
预编译
./configure --extra-cflags=-I/usr/local/cuda/include --extra-ldflags=-L/usr/local/cuda/lib64 --extra-cflags="-I/usr/local/include" --extra-ldflags="-L/usr/local/lib" --extra-libs="-lpthread -lm -latomic" --enable-gmp --enable-gpl --enable-libaom --enable-libass --enable-libfreetype --enable-libmp3lame --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopus --enable-librtmp --enable-libsnappy --enable-libsoxr --enable-libssh --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-nonfree --enable-version3 --enable-pthreads --enable-openssl --prefix=/usr/local/ffmpeg --enable-static --enable-shared --enable-ffplay --enable-cuda-nvcc --enable-libnpp
编译
make -j4
安装编译生成文件
sudo make install