编译ffmpeg 生成结果没有ffplay 的问题解决

之前一直有这个问题,但没有解决。最近查到文档,并不是编译参数的原因,而是因为系统没有sdl2 的依赖库。configure 时找不到这个依赖库,所以没有编译出来ffplay 了。树莓派添加sdl2 的方法是

sudo apt-get install libstdl1.2-dev

之后再 configure 就可以看到包含了 ffplay  了

编译FFMPEG 使用 硬件编码、解码器,树莓派版

树莓派官方操作系统 64位版,通过自行编译 ffmpeg 添加引用,可以使用树莓派自带的硬件进行视频硬件编码、解码。

sudo apt install libdrm-dev librtmp-dev libsnappy-dev libsoxr-dev libssh-dev libvorbis-dev libvpx-dev libfreetype-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libopus-dev libwebp-dev libx264-dev libx265-dev libxml2-dev libdav1d-dev libgmp-dev libaom-dev libass-dev

./configure –extra-cflags=”-I/usr/local/include” –extra-ldflags=”-L/usr/local/lib” –extra-libs=”-lpthread -lm -latomic” –arch=armel –enable-gmp –enable-gpl –enable-libaom –enable-libass –enable-libdav1d –enable-libfdk-aac –enable-libfreetype –enable-libkvazaar –enable-libmp3lame –enable-libopencore-amrnb –enable-libopencore-amrwb –enable-libopus –enable-librtmp –enable-libsnappy –enable-libsoxr –enable-libssh –enable-libvorbis –enable-libvpx –enable-libzimg –enable-libwebp –enable-libx264 –enable-libx265 –enable-libxml2 –enable-nonfree –enable-omx –enable-omx-rpi –enable-version3 –enable-pthreads –enable-openssl –enable-hardcoded-tables –prefix=/usr/local/ffmpeg –enable-static –enable-shared –arch=aarch64 –target-os=linux –enable-ffplay

make -j4

sudo make install

后记,根据文档,应该可以使用–enable-mmal  参数开启博通的硬件编解码支持,但因为使用了最新的64位版官方操作系统,而 mmal 库默认没有64 位版,虽然偿试了用 github 上的 userland 的源码自行编译,但不成功。所以只能暂时这样使用了。

raspberry pi 3b+ 编译opencv

raspberry pi 3B+ 在安装openvino 时需要编译opencv

其间首先需要先安装如何依赖库

sudo apt install build-essential libclang-11-dev clang-11 clang-format-9 libssl-dev

sudo apt install git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libatlas-base-dev python3-scipy

然后使用如下 configure 参数

cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local ..

然后就是 make

这里有个坑,因为raspberry pi 3b+ 只有1G内存,而编译opencv 在某个库需要超过1G内存,差不多达到2G的内存需求,而raspberry OS 默认只有100 M 的虚拟内存,所以会因为内存不足导致卡死,这里需要修改虚拟内存大小,最好加到4G 来保存编译通过

sudo dphys-swapfile swapoff
sudo vim /etc/dphys-swapfile
CONF_SWAPSIZE=4096

下面哪个MAX也需要改到4096

sudo dphys-swapfile setup

sudo reboot

Raspberry pi 上安装Intel NCS2 的坑

查了google ,问了chatGPT 以为万无一失了。根据chatGPT的提示打开了Intel 关于在Raspberry pi 上安装 OpenVINO的官网,然后再接照官网的说明一步一步执行完成各安装脚本命令,但在python 中运行

使用openvino查看可使用设备

只有CPU ,真是日了狗了。

然后翻查了各个外国文档,然后找到,尼玛,官网的openVINO没有Raspberry pi 的插件所以不使用官网的这个版本的openVINO只有CPU,fuck。然后必须要使用从github上下载的源码编译才能生成出有Raspberry Pi 插件的版本。

cmos像元计算方法

1英寸等于16mm ,但不能适用所有的尺寸,小于1/2英寸的CIS,则要用1英寸等于18mm来换算。比如索尼1/2.8 的IMX415 对角线长度为6.43mm,英1英寸等于18mm则刚好。所以对于海康等监控摄像头,使用1英寸等于18mm来计算对角线尺寸,然后再通过4:3 的比例计算物理的长宽尺寸。

18*1/2.8=6.429mm

4x*4x+3x*3x=6.429*6.429

按4:3,则长为5.143mm,则像元为5.143/1920=2.68um

c++通过代码动态加载库文件并调用库里的类和方法

首先需要先在库文件的工程定义extern “c”

/**
 * 因在开发阶段发现tensorflow 与 海康的sdk 存在冲突,在还没有找到更好的解决方法时,使用动态加载so库的方法解决,
 * 以下是为了使动态加载能找到函数标识符而加入的接口函数,通过函数调用FrameProcessHelper类
*/
extern “C”{
    FrameProcessHelper * create(std::string names_file,std::string cfg_file,std::string weights_file);
//    void detect_and_track(cv::Mat org_frame,FrameProcessHelper & helper);
    std::vector<bbox_t> get_detect_track_result(cv::Mat & org_frame,FrameProcessHelper & helper);
    void draw_frame(cv::Mat & org_frame,bbox_t & dets, ais_data & ais,std::string & ocr_result,double & speed,FrameProcessHelper & helper);
}
CMakeList 定义输出的类型
add_library(new_detect SHARED
xxxx.cpp
xxxx.h
c++动态调用库文件代码截图说明

pip 离线安装本地包

因为服务器所在网络环境原因,不得不需要离线安装python 依赖包

使用如下方法,只下载需要的依赖包:

python -m pip download -r requirements.txt -d 目录

这方法会自动下载依赖包的依赖包,然后整个打包到目标服务器,然后在解压包所在目录运行

python -m pip install –no-index –find-links=目录名 -r requirements.txt

完成

Docker:将docker容器保存为docker镜像(打成tar包)

将docker容器保存为 tar 包
1、docker commit <容器id> <镜像名>:<tag> —- 将容器保存成镜像

保存后 docker images 便可以看到镜像

2、docker save -o <tar包名>.tar <镜像名>:<tag> —- 将镜像保存为.tar文件,默认保存在当前目录

· 从 tar 包导入docker镜像
1、docker load -i <tar包名>.tar —- 从 tar 包导入镜像

导入镜像后,通过 docker images 便可看到导入的镜像。

2、docker run -itd -p <本地端口>:<容器端口> <镜像名>:<tag> —- 通过镜像起容器

· 案例
1、docker commit 294oajfhfnci abcdef:latest —- 将294oajfhfnci容器保存为镜像abcdef

2、docker save -o abcdef.tar abcdef:latest —- 将镜像abcdef保存为abcdef.tar

3、docker load -i abcdef.tar —- 从 abcdef.tar 导入镜像

4、docker run -itd -p 8888:80 –restart=always abcdef:latest —- 通过abcdef镜像启动容器
————————————————
版权声明:本文为CSDN博主「普通网友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/m0_54866636/article/details/126327700

实现tensorflow 2.11离线编译的一种方法

因为服务器所在网络环境的原因,不得不在无法连接外网的环境下编译tensorflow 。过程有点痛苦,走了不少弯路,最后还是实现了。具体方法是,先在一台能连接互联网的机器上使用正常的方法用官方提供的bazel 编译一遍。然后,编译过程中他会自动下载所有需要的包到~/.cache/baxel/_bazel_(用户名)这个目录。(足足差不多10G!),然后把这个目录整个打包复制到不能连接外网的目标机器。放在相同目录下,注意目录需要改为当前用户名。然后把 tensorflow-2.11(源码所在目录)/tensorflow/ 里的 workspace 0 – 3. bzl 文件里的包改为本地目录位置,方法可以是,改为file://xxxxx/ 这样的方式,也可以是搭建一个web 服务,然后改为 http://xxxx/xxx.tar.gz  这样的方式。这个自行发挥了。最后他还有个提示,说有个什么目录文件存在,所以编译不了,直接把哪个目录删了就行。还有一个问题是他会提示验证golang sdk 版本,这个问题很奇怪,我试了两台机,一台不用管,直接跳过了。另一台是强行修改了一个sdk.bzl  文件,把他要打开的一个go 版本校验js  手工下载并改到这个sdk.bzl 文件里才能通过。这个看他提示照着办了。