使用飞凌嵌入式IMX6UL-C1板子——qt+opencv环境搭建

简介: 使用飞凌嵌入式IMX6UL-C1板子——qt+opencv环境搭建

使用飞凌嵌入式IMX6UL-C1板子——qt+opencv环境搭建

准备工作:

  • Ubuntu18.04虚拟机环境
  • 飞凌官方提供的qt-tslib库,gcc交叉编译器,opencv源码库,qt源码,具体如下:

20191107110110412.png

安装交叉编译器

  • 方便环境编译,将交叉编译器安装到/usr/local/下新建一个文件目录arm-imx6ul。
sudo mkdir /usr/local/arm-imx6ul
cd /usr/local/arm-imx6ul
sudo cp ~/feiling/gcc-4.6.2-glibc-2.13-linao-multilib-2011.12.tar.gz .
sudo tar -xvf gcc-4.6.2-glibc-2.13-linao-multilib-2011.12.tar.gz
#加入环境变量
sudo vi /etc/environment
# 添加环境编译
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm-imx6ul/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/:/opt/mips64el-buildroot-linux-gnu_sdk-buildroot/bin"
source /etc/environment


  • 解压完即完成了交叉编译器的安装。

安装qt SDK

执行以下命令


cd /files/
mkdir /usr/local/freescale
cp QT4.8.6-SDK.tar.bz2 /usr/local/freescale/
cd /usr/local/freescale/
tar jxvf QT4.8.6-SDK.tar.bz2


注意此步完成后/usr/local 下会有/freescale/QT4.8.6 文件夹,文件名必须与此保持一致,不能改动


安装tslib

cd /files/
cp tslib-sdk.tar.bz2 /usr/local/arm-imx6ul
cd /usr/local/arm-imx6ul
tar jxvf tslib-sdk.tar.bz2


安装qt creator

执行以下命令:

cd /files/
chmod 777 qt-creator-linux-x86-opensource-2.6.2.bin
./qt-creator-linux-x86-opensource-2.6.2.bin
# 点击“Finish”完成。
# 执行以下命令打开 Qt Creator:
cd /opt/qtcreator-2.6.2/bin/
./qtcreator &


qt开发环境配置

  • 打开qt creator ,选择Tools ->Options->Build & Run->Compilers,添加前一步安装好的qt-sdk路径及编译器路径。如下图:

20191107113831163.png20191107113845108.png2019110711385646.png

此时,发现报错

20191107113951510.png

qt version is not properly installed,错误修复

  • 该错误发现是qmake的版本不匹配目前使用的机器或者Ubuntu18.04的版本太高了。

20191107114116996.png

  • 所以决定使用qt源代码编译一版飞凌下使用的qtSDK环境。

使用源码编译qt-SDK

  • 下载qt源代码。
  • qt源码下载
  • 进入源码下,执行:
# 解压源码
tar -xvf qt-everywhere-src-4.8.6.tar.gz
cd qt-everywhere-src-4.8.6/mkspecs
cp ~/feiling/linux-imx6ul-g++ . -rf
# 修改linux-imx6ul-g++/qmake.conf
#
# qmake configuration for building with arm-none-linux-gnueabi-g++
#
export CROSS_COMPILE=/usr/local/arm-imx6ul/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-fsl-linux-gnueabi-
#export ROOTFS=/dv/nfs/bt
include(../../common/linux.conf)
include(../../common/gcc-base-unix.conf)
include(../../common/g++-unix.conf)
include(../../common/qws.conf)
# modifications to g++.conf
QMAKE_CC                = arm-fsl-linux-gnueabi-gcc -lts
QMAKE_CXX               = arm-fsl-linux-gnueabi-g++ -lts
QMAKE_LINK              = arm-fsl-linux-gnueabi-g++ -lts
QMAKE_LINK_SHLIB        = arm-fsl-linux-gnueabi-g++ -lts
QMAKE_LFLAGS    += -W1,rpath=/work/imx6/rootfs/usr/lib
# modifications to linux.conf
QMAKE_AR                = arm-fsl-linux-gnueabi-ar cqs
QMAKE_OBJCOPY           = arm-fsl-linux-gnueabi-objcopy
QMAKE_STRIP             = arm-fsl-linux-gnueabi-strip
#QMAKE_INCDIR                = /work/imx6/rootfs/usr/include
#QMAKE_INCDIR               +=/work/imx6/rootfs/usr/include/arm-linux-gnueabi/
QMAKE_INCDIR                +=/usr/local/arm-imx6ul/tslib/include
QMAKE_LIBDIR                +=/usr/local/arm-imx6ul/tslib/lib
#QMAKE_INCDIR_OPENGL         = /work/imx6/rootfs/usr/include/GL
#QMAKE_LIBDIR_OPENGL         = /work/imx6/rootfs/usr/lib
#QMAKE_INCDIR_OPENGL_ES1     = /usr/include/GLES
#QMAKE_LIBDIR_OPENGL_ES1     = /tftpboot/rootfs/usr/lib
#QMAKE_INCDIR_OPENGL_ES1CL   = /tftpboot/rootfs/usr/include/GLES
#QMAKE_LIBDIR_OPENGL_ES1CL   = /tftpboot/rootfs/usr/lib
#QMAKE_INCDIR_OPENGL_ES2     = /work/imx6/rootfs/usr/include/GLES2
#QMAKE_LIBDIR_OPENGL_ES2     = /work/imx6/rootfs/usr/lib
#QMAKE_INCDIR_EGL            = /work/imx6/rootfs/usr/include/EGL
#QMAKE_LIBDIR_EGL            = /work/imx6/rootfs/usr/lib
#QMAKE_LIBDIR_GAL            = /work/imx6/rootfs/usr/lib
#QMAKE_INCDIR_GAL            = /work/imx6/rootfs/usr/include/
QMAKE_LIBS_OPENGL_ES1       += -lGLESv1_CM -lEGL -lGAL
QMAKE_LIBS_OPENGL_ES1CL     += -lGLES_CL -lEGL -lGAL
#QMAKE_LIBS_EGL              += -lEGL
QMAKE_LIBS_EGL              += -lEGL -lGAL
QMAKE_LIBS_OPENGL_ES2       += -lGLESv2 -lEGL -lGAL
QMAKE_LIBS_OPENVG           += -lOpenVG -lEGL -lGAL
IMX6_CFLAGS             = -march=armv7-a -mfpu=neon -DLINUX=1 -DEGL_API_FB=1
IMX6_CFLAGS_RELEASE     = -O2 $$IMX6_CFLAGS
QMAKE_CFLAGS_RELEASE   += $$IMX6_CFLAGS_RELEASE
QMAKE_CXXFLAGS_RELEASE += $$IMX6_CFLAGS_RELEASE
QMAKE_CFLAGS_DEBUG     += $$IMX6_CFLAGS
QMAKE_CXXFLAGS_DEBUG   += $$IMX6_CFLAGS
load(qt_config)


  • 后发现不能使用这个linux-imx6ul-g++的配置,需要使用qws/linux-arm-g++的配置进行configure配置,而使用的configure的配置如下:
#!/bin/sh
./configure \
 -prefix /opt/QT4.8.6 \
 -opensource \
 -confirm-license \
 -release -shared \
 -embedded arm \
 -xplatform qws/linux-arm-g++ \
 -depths 16,18,24,32 \
 -fast \
 -optimized-qmake \
 -little-endian -host-little-endian \
 -pch \
 -qt-sql-sqlite \
 -qt-libjpeg \
 -qt-zlib \
 -qt-libpng \
 -qt-libmng \
 -qt-libtiff \
 -qt-freetype \
 -webkit \
 -multimedia \
 -audio-backend \
 -phonon-backend \
 -no-openssl \
 -no-glib \
 -no-qt3support \
 -no-libtiff -no-libmng \
 -no-opengl \
 -no-mmx -no-sse -no-sse2 \
 -no-3dnow \
 -no-qvfb \
 -phonon-backend \
 -no-nis \
 -no-opengl \
 -no-cups \
 -no-separate-debug-info \
 -nomake docs \
 -qt-mouse-tslib \
 -qt-mouse-linuxinput \
 -qt-kbd-linuxinput \
 -qt-gfx-transformed \
 -qt-gfx-linuxfb \
 -I/usr/local/arm-imx6ul/tslib/include \
 -L/usr/local/arm-imx6ul/tslib/lib


  • 执行后提示:

20191107140952653.png

  • 以上报错
You have not explicitly asked to use pkg-config and are cross-compiling.
pkg-config will not be used to automatically query cflag/lib parameters for
dependencies


  • 添加配置选项 -force-pkg-config
  • 测试之后还是报错,判断应该是tslib库不匹配的原因,考虑到后期不需要触摸功能,所以去掉-qt-mouse-tslib配置选项,重新配置编译:

20191107155252348.png

此时成功:

  • 参考autoconfig.sh的内容如下:
#!/bin/sh
./configure \
 -force-pkg-config \
 -prefix /opt/QT4.8.6 \
 -opensource \
 -confirm-license \
 -release -shared \
 -embedded arm \
 -xplatform qws/linux-arm-g++ \
 -depths 16,18,24,32 \
 -fast \
 -optimized-qmake \
 -little-endian -host-little-endian \
 -pch \
 -qt-sql-sqlite \
 -qt-libjpeg \
 -qt-zlib \
 -qt-libpng \
 -qt-libmng \
 -qt-libtiff \
 -qt-freetype \
 -webkit \
 -multimedia \
 -audio-backend \
 -phonon-backend \
 -no-openssl \
 -no-glib \
 -no-qt3support \
 -no-libtiff -no-libmng \
 -no-opengl \
 -no-mmx -no-sse -no-sse2 \
 -no-3dnow \
 -no-qvfb \
 -phonon-backend \
 -no-nis \
 -no-opengl \
 -no-cups \
 -no-separate-debug-info \
 -nomake docs \
 -qt-mouse-linuxinput \
 -qt-kbd-linuxinput \
 -qt-gfx-transformed \
 -qt-gfx-linuxfb \
# -I/usr/local/arm-imx6ul/tslib/include \
# -L/usr/local/arm-imx6ul/tslib/lib
 #-nomake examples -nomake tools -nomake docs \
 #-no-xcursor -no-xfixes -no-xrandr -no-xrender \
#
# -qt-mouse-tslib \
#make -j8
#
#make install -j8
#exit


  • 执行make 编译:
  • 报错

20191107160252950.png

  • 该报错为qmake路径不对,进入Makefile修改qmake路径:
cd src/tools/bootstrap/Makefile
QMAKE         = /home/ww/feiling/qt-source/qt-everywhere-opensource-src-4.8.6/bin/qmake
sudo make


  • 进行make编译。
  • 继续报错:

20191107160735247.png

依然还是老毛病,发现所有的Makefile都是这个问题,所以现在清除所有Makefile进行重新配置编译。

find ./ -name Makefile -delete
sudo ./autoconfigure.sh

2019110716105817.png

  • 进行make编译,等待。

【报错】提示缺少libz.so.1的动态库:

20191108091249514.png

【重新添加libz.so.1的系统依赖动态库后再次报错】

20191108100434267.png

修改:vim src/corelib/Makefile 加上-lrt

LIBS          = $(SUBLIBS)  -L/opt/qt-everywhere-opensource-src-4.8.4/lib -lpthread -lm -ldl -lrt


  • 继续编译

【报错】error: ‘QSharedMemory’ does not name a type


  • 尝试清理重新编译:
make confclean
./autoconfigure.sh
make


【编译成功】


  • make install
  • 在安装目录下生成编译成功后的qmake

20191108150556680.png

  • 继续前一步,在qt creator上添加新编译产生的qmake:

20191108150652383.png

opencv交叉编译:

  • 下载opencv源码
  • 安装编译依赖库 cmake 、cmake-qt-gui
sudo apt-get install cmake
sudo apt-get install cmake-qt-gui
cd /home/ww/feiling/opencv/opencv-2.4.13.6
sudo cmake-gui

20191108150946732.png

  • 设定好其中的源码路径,生成的编译库路径,选择交叉编译器的环境等等,然后进入刚刚选择好的编译路径下;
  • 进入编译路径下:make
  • 等待出错:

【出错】

错误1: 没有链接到 pthread 库


../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_destroy'
../../lib/libopencv_core.so: undefined reference to `pthread_create'
../../lib/libopencv_core.so: undefined reference to `dlopen'
../../lib/libopencv_core.so: undefined reference to `pthread_mutex_trylock'
../../lib/libopencv_core.so: undefined reference to `clock_gettime'
../../lib/libopencv_core.so: undefined reference to `dlsym'
../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_settype'
../../lib/libopencv_core.so: undefined reference to `pthread_join'
../../lib/libopencv_core.so: undefined reference to `pthread_mutexattr_init'
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误 2
make: *** [all] 错误 2


解决1:

修改编译目录下的 CMakeCache.txt 文件:


找到 CMAKE_EE_LINKER_FLAGS:STRING 项:


190 //Flags used by the linker.
 191 CMAKE_EXE_LINKER_FLAGS:STRING=' '


修改成以下:

190 //Flags used by the linker.
 191 CMAKE_EXE_LINKER_FLAGS:STRING= -pthread -lrt


修改完成,继续 make


等待出错…


  • 错误2: 没有链接到 dl 库
[ 49%] Built target opencv_ts
Linking CXX executable ../../bin/opencv_perf_core
../../lib/libopencv_core.so: undefined reference to `dlopen'
../../lib/libopencv_core.so: undefined reference to `dlsym'
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误 2
make: *** [all] 错误 2


  • 解决2:

同样是 CMAKE_EE_LINKER_FLAGS:STRING ,继续添加 -ldl

190 //Flags used by the linker.
 191 CMAKE_EXE_LINKER_FLAGS:STRING= -pthread -lrt -ldl


再make…


  • 错误3:

用arm-2009q3(4.4.1)编译工具链编译时,还会出现以下错误(4.6.3无此报错)

/root/library/opencv/opencv-3.2.0/modules/imgproc/src/drawing.cpp:1026: error: call of overloaded 'abs(long long int&)' is ambiguous
/usr/local/arm/arm-2009q3/bin/../arm-none-linux-gnueabi/libc/usr/include/stdlib.h:720: note: candidates are: int abs(int)


  • 解决3:

百度解决方案,将错误处的drawing.cpp文件中的 abs()函数改为 fabs()

再再make …


  • 错误4:

用arm-2009q3(4.4.1)编译工具链编译时,还会出现以下错误(4.5.1无此报错)


Linking CXX executable ../../bin/opencv_perf_core
/usr/local/arm/arm-2009q3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: ../../bin/opencv_perf_core: hidden symbol `__sync_fetch_and_add_4' in /usr/local/arm/arm-2009q3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/libgcc.a(linux-atomic.o) is referenced by DSO
/usr/local/arm/arm-2009q3/bin/../lib/gcc/arm-none-linux-gnueabi/4.4.1/../../../../arm-none-linux-gnueabi/bin/ld: final link failed: Nonrepresentable section on output
collect2: ld returned 1 exit status
make[2]: *** [bin/opencv_perf_core] 错误 1
make[1]: *** [modules/core/CMakeFiles/opencv_perf_core.dir/all] 错误 2
make: *** [all] 错误


  • 解决4:

无解。。。。。。暂未找到对应办法

建议换个高版本的编译工具链吧。

相同配置,arm-2009q3(4.4.1)比4.6.1多了几个怪怪的问题。


  • ** 编译完成,编译安装**


sudo make install

201911081524413.png

最后一步,重新编译飞凌板子的内核

  • 进入linux内核linux-3.14
  • 修改build.sh内容.
#!/bin/bash
export CPUS=`grep -c processor /proc/cpuinfo`
export ARCH=arm
#export CROSS_COMPILE=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-
export CROSS_COMPILE=/usr/local/arm-imx6ul/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/arm-none-linux-gnueabi-
#export PATH=/opt/freescale/usr/local/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin:$PATH
export PATH=/usr/local/arm-imx6ul/gcc-4.6.2-glibc-2.13-linaro-multilib-2011.12/fsl-linaro-toolchain/bin/:$PATH
DEVTYPE=$1
make distclean
if [ -n "$DEVTYPE" ]; then
  if [ ${DEVTYPE} == "emmc" ]; then
  make linux_imx6ul_emmc_defconfig 
  elif [ ${DEVTYPE} == "nand" ]; then
  make linux_imx6ul_nand_defconfig
  else
  echo "not support now"
  fi;
fi;
make zImage -j${CPUS}
make dtbs -j${CPUS}
make modules -j${CPUS


  • 执行source build.sh emmc
  • 【报错】
scripts/kconfig/conf --silentoldconfig Kconfig
  CHK     include/config/kernel.release
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
make[1]: 'include/generated/mach-types.h' is up to date.
  CALL    scripts/checksyscalls.sh
  CHK     include/generated/compile.h
  GZIP    kernel/config_data.gz
  CHK     kernel/config_data.h
  Kernel: arch/arm/boot/Image is ready
  LZO     arch/arm/boot/compressed/piggy.lzo
/bin/sh: 1: lzop: not found
/home/ww/feiling/kernel/linux-3.14.38/arch/arm/boot/compressed/Makefile:193: recipe for target 'arch/arm/boot/compressed/piggy.lzo' failed
make[2]: *** [arch/arm/boot/compressed/piggy.lzo] Error 1
/home/ww/feiling/kernel/linux-3.14.38/arch/arm/boot/Makefile:52: recipe for target 'arch/arm/boot/compressed/vmlinux' failed
make[1]: *** [arch/arm/boot/compressed/vmlinux] Error 2
/home/ww/feiling/kernel/linux-3.14.38/arch/arm/Makefile:305: recipe for target 'zImage' failed
make: *** [zImage] Error 2


  • 缺少依赖库
sudo apt-get install lzop


  • 再次make

20191108161757604.png

  • 至此,内核编译完成。

rootfs文件系统的搭建

  • 这里因为考虑到更好LCD屏幕的问题,为了验证LCD屏幕,先使用官方提供的rootfs文件系统进行烧写。
  • 然后通过制作SD卡进行板子烧写。

制作SD烧写卡

  • 使用官方提供的SD卡制作包
cp /update.tar.bz2 ./
cp /createSdcard.sh ./
# 插入SD卡
sudo ./createSdcard.sh

201911081635457.png

Copying boot partition
untar update.tar.bz2 to boot partition
sdrun/
sdrun/u-boot.imx
sdrun/zImage
sdrun/imx6ul-14x14-evk.dtb
sdrun/ramdisk.img.u
target/
target/modules.tar.bz2
target/imx6ul-14x14-evk-emmc-c-bak.dtb
target/u-boot.imx
target/imx6ul-14x14-evk-emmc-c-10.4-800x600.dtb
target/rootfs.tar.bz2
target/logo.bmp
target/zImage
target/imx6ul-14x14-evk-emmc-c-7-1024x600.dtb
target/imx6ul-14x14-evk-emmc-c-8-800x600.dtb
target/imx6ul-14x14-evk-emmc-c-10.1-1280x800.dtb
target/imx6ul-14x14-evk-emmc-c-5.6-640x480.dtb
target/imx6ul-14x14-evk-emmc-c-7-800x480.dtb
target/imx6ul-14x14-evk-emmc-c-3.5-320x240.dtb
target/imx6ul-14x14-evk-emmc-c-4.3-480x272.dtb
Buring th u-boot.imx to sdcard
129+0 records in
129+0 records out
132096 bytes (132 kB, 129 KiB) copied, 0.044627 s, 3.0 MB/s
371+0 records in
371+0 records out
379904 bytes (380 kB, 371 KiB) copied, 0.128936 s, 2.9 MB/s
Syncing....
Un-mount the partitions 
umount: boot: not mounted.
Remove created temp directories 
Operation Finished


  • 制作完成,将刚刚编译后的linux内核zImage及设备树.dtb更换到SD卡中。
  • 将上一节中制作好的 SD 卡插入,同时将拨码开关置于下图所示。 1 4 ON, 2 3 5 6 7 8 OFF,如下图:

20191108172237679.png

则可以从 sd 卡启动系统

  • 启动CRT,进入串口查看串口debug信息:

20191108172459761.png

  • 烧写完成,显示:

20191108174849759.png

  • 将拨片调回emmc启动,1 4 5 on 其他off。
  • 重启启动,显示失败,文件系统正常。


相关文章
|
2月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
109 7
基于qt的opencv实时图像处理框架FastCvLearn实战
|
2月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
135 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
2月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
45 10
|
2月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
|
2月前
|
机器学习/深度学习 计算机视觉 Python
opencv环境搭建-python
本文介绍了如何在Python环境中安装OpenCV库及其相关扩展库,包括numpy和matplotlib,并提供了基础的图像读取和显示代码示例,同时强调了使用Python虚拟环境的重要性和基本操作。
|
3月前
|
计算机视觉
使用QT显示OpenCV读取的图片
使用QT显示OpenCV读取的图片
74 1
|
5月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
175 1
|
5月前
|
运维 算法 计算机视觉
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
【Qt&OpenCV 图像的模板匹配 matchTemplate/minMaxLoc】
82 1
|
5月前
|
存储 编解码 算法
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
【Qt&OpenCV 检测图像中的线/圆/轮廓 HoughLinesP/HoughCircles/findContours&drawContours】
92 0
|
4月前
|
机器学习/深度学习 人工智能 计算机视觉
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
好的资源-----打卡机+Arm+Qt+OpenCV嵌入式项目-基于人脸识别的考勤系统-----B站神经网络与深度学习,商城
下一篇
无影云桌面