在windows 的vs 环境中默认使用的是带BOM的UTF,但即使在保存源代码文件时选 了UTF8 ,编译后同样还是会乱码。经再三研究后,发现需在工程文件的属性-》C/C++ -》命令行中加入%(AdditionalOptions) /source-charset:utf-8 /execution-charset:utf-8
加入后重新编译就可以了
一个无聊和记录一些东西的博客
在windows 的vs 环境中默认使用的是带BOM的UTF,但即使在保存源代码文件时选 了UTF8 ,编译后同样还是会乱码。经再三研究后,发现需在工程文件的属性-》C/C++ -》命令行中加入%(AdditionalOptions) /source-charset:utf-8 /execution-charset:utf-8
加入后重新编译就可以了
因为从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 ..
使用 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 开始不再支持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
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 的 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 参数。
最后加入这个后,问题解决
顺序执行下面命令
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
安装编译依赖
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
之前在64位操作系统上,直接使用 sudo vim /etc/fstab 加上USB 外接的硬盘就可以了,但在32位系统上,不知道为什么,行不通。所以,使用了如下的办法:
sudo vim /etc/rc.local
在最后 exit 0 之前
加入
sleep 20
sudo mount /dev/sda1 /media/pi -o uid=1000,gid=1000
重启,等20秒,然后就可以了