segunda-feira, 23 de setembro de 2024

MILK-V DUO OPENCV - Duo/Duo256M/DuoS

 

milkv-duo
riscv64-linux-musl
✅ HW JPG decoder
✅ MIPI CSI camera
opencv4-milkv-duo

Tradução e testes (Duo 256)

opencv-mobile é uma versão leve da biblioteca OpenCV que minimiza a compilação do OpenCV ajustando os parâmetros de compilação e removendo certas partes do código-fonte do OpenCV.

O opencv-mobile fornece funcionalidades comumente usadas do OpenCV, como processamento de imagem, operações de matriz e muito mais. Ele permanece sincronizado com a versão upstream e não tem dependências de terceiros. Na maioria dos casos, ele pode substituir perfeitamente o OpenCV oficial com apenas 1/10 do tamanho, tornando-o particularmente adequado para ambientes móveis e incorporados com requisitos de tamanho específicos.

Comparação de tamanhos de pacotes de código-fonte:

Link do projeto: https://github.com/nihui/opencv-mobile | Obrigado a nihui!

dica

O opencv-mobile já suporta decodificação JPG acelerada por hardware e aceleração de hardware VPSS (Video Processing Subsystem) no Milk-V Duo/Duo256M/DuoS.

1. Passos rápidos

Podemos baixar diretamente o pacote pré-compilado de lançamento para testar funções básicas ou realizar o desenvolvimento de aplicativos.

Um exemplo de teste é fornecido no código-fonte do projeto, demonstrando como usar o opencv-mobile para carregar imagens, aplicar zoom e salvar imagens.

Tomando este programa de teste como exemplo, apresentaremos o método de compilação do opencv-mobile no ambiente Linux e como executá-lo no Milk-V Duo.

Baixe o pacote pré-compilado para Milk-V Duo

O link de lançamento do opencv-mobile: https://github.com/nihui/opencv-mobile/releases

Baixe o último pacote pré-compilado do Milk-V Duo: https://milkv.io/duo

Crie um novo diretóriotório

Crie um novo diretório picture-resize e digite:

mkdir picture-resize
cd picture-resize

Extraia o pacote pré-compilado baixado para o diretório atual:

unzip opencv-mobile-4.9.0-milkv-duo.zip

Criar código fonte

Crie um novo arquivo chamado main.cpp:

vi main.cpp

Adicione o seguinte:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main()
{
cv::Mat bgr = cv::imread("in.jpg", 1);

cv::resize(bgr, bgr, cv::Size(200, 200));

cv::imwrite("out.jpg", bgr);

return 0;
}

Sua função é dimensionar uma imagem nomeada in.jpgpara um tamanho 200x200e então gerá-la como um arquivo out.jpg.

Crie CMakeLists.txt

Para compilar usando cmake, você precisa criar um arquivo CMakeLists.txt:

vi CMakeLists.txt

O conteúdo é o seguinte:

project(opencv-mobile-test) cmake_minimum_required(VERSION 3.5) set(CMAKE_CXX_STANDARD 11) set(CMAKE_C_COMPILER "${CMAKE_CURRENT_SOURCE_DIR}/host-tools/gcc/riscv64-linux-musl-x86_64/bin/riscv64-unknown-linux-musl-gcc") set(CMAKE_CXX_COMPILER "${CMAKE_CURRENT_SOURCE_DIR}/host-tools/gcc/riscv64-linux-musl-x86_64/bin/riscv64-unknown-linux-musl-g++") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -mcpu=c906fdv -march=rv64imafdcv0p7xthead -mcmodel=medany -mabi=lp64d") set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/opencv-mobile-4.10.0-milkv-duo/lib/cmake/opencv4") find_package(OpenCV REQUIRED) add_executable(opencv-mobile-test main.cpp) target_link_libraries(opencv-mobile-test ${OpenCV_LIBS})

Há três variáveis ​​que precisam ser observadas e configuradas de acordo com seu próprio caminho de arquivo:

  • OpenCV_DIR : O diretório correspondente ao pacote pré-compilado previamente extraído para o diretório atual. Preste atenção ao número da versão no caminho.
  • CMAKE_C_COMPILER : O caminho para o gcc na cadeia de ferramentas de compilação cruzada.
  • CMAKE_CXX_COMPILER : O caminho para g++ na cadeia de ferramentas de compilação cruzada

Link para download para cross-compilation toolchain: host-tools.tar.gz . Você pode baixá-lo através do comando wget e então descompactar:

wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz
tar -xf host-tools.tar.gz

Se você já compilou duo-buildroot-sdk , o diretório  host-tools sob seu diretório raiz é o diretório da cadeia de ferramentas de compilação cruzada. Não há necessidade de baixá-lo novamente. Você pode modificá-lo OpenCV_DIR e especificá-lo diretamente para este diretório. Ou criar um link apontando para o diretório.

Compile

Compilar no modo cmake criará alguns diretórios e arquivos intermediários, então criamos um novo diretório build e entramos neste diretório para concluí-lo:

mkdir build
cd build
cmake ..
make

A saída normal da compilação é a seguinte:

$ make
[ 50%] Building CXX object CMakeFiles/opencv-mobile-test.dir/main.cpp.o
[100%] Linking CXX executable opencv-mobile-test
[100%] Built target opencv-mobile-test

Erro gerado porque a versão estava errada no CMakeLists.txt
set(OpenCV_DIR "${CMAKE_CURRENT_SOURCE_DIR}/opencv-mobile-4.10.0-milkv-duo/lib/cmake/opencv4")

Welcome to Ubuntu 22.04.2 LTS (GNU/Linux 5.15.153.1-microsoft-standard-WSL2 x86_64) * Documentation: https://help.ubuntu.com * Management: https://landscape.canonical.com * Support: https://ubuntu.com/advantage This message is shown once a day. To disable it please create the /home/ubuntu/.hushlogin file. ubuntu@DESKTOP-UHGFA4M:~$ make make: *** No targets specified and no makefile found. Stop. ubuntu@DESKTOP-UHGFA4M:~$ ubuntu@DESKTOP-UHGFA4M:~$ mkdir picture-resize ubuntu@DESKTOP-UHGFA4M:~$ cd picture-resize/ ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ unzip ../opencv-mobile-4.9.0-milkv-duo.zip unzip: cannot find or open ../opencv-mobile-4.9.0-milkv-duo.zip, ../opencv-mobile-4.9.0-milkv-duo.zip.zip or ../opencv-mobile-4.9.0-milkv-duo.zip.ZIP. ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ unzip opencv-mobile-4.9.0-milkv-duo.zip unzip: cannot find or open opencv-mobile-4.9.0-milkv-duo.zip, opencv-mobile-4.9.0-milkv-duo.zip.zip or opencv-mobile-4.9.0-milkv-duo.zip.ZIP. ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ dir opencv-mobile-4.10.0-milkv-duo.zip opencv-mobile-4.10.0-milkv-duo.zip:Zone.Identifier ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ unzip opencv-mobile-4.10.0-milkv-duo.zip Archive: opencv-mobile-4.10.0-milkv-duo.zip creating: opencv-mobile-4.10.0-milkv-duo/ creating: opencv-mobile-4.10.0-milkv-duo/bin/ inflating: opencv-mobile-4.10.0-milkv-duo/bin/setup_vars_opencv4.sh creating: opencv-mobile-4.10.0-milkv-duo/share/ creating: opencv-mobile-4.10.0-milkv-duo/share/licenses/ creating: opencv-mobile-4.10.0-milkv-duo/share/licenses/opencv4/ inflating: opencv-mobile-4.10.0-milkv-duo/share/licenses/opencv4/mscr-chi_table_LICENSE.txt inflating: opencv-mobile-4.10.0-milkv-duo/share/licenses/opencv4/SoftFloat-COPYING.txt creating: opencv-mobile-4.10.0-milkv-duo/lib/ inflating: opencv-mobile-4.10.0-milkv-duo/lib/libopencv_core.a inflating: opencv-mobile-4.10.0-milkv-duo/lib/libopencv_highgui.a inflating: opencv-mobile-4.10.0-milkv-duo/lib/libopencv_video.a inflating: opencv-mobile-4.10.0-milkv-duo/lib/libopencv_features2d.a inflating: opencv-mobile-4.10.0-milkv-duo/lib/libopencv_imgproc.a creating: opencv-mobile-4.10.0-milkv-duo/lib/cmake/ creating: opencv-mobile-4.10.0-milkv-duo/lib/cmake/opencv4/ inflating: opencv-mobile-4.10.0-milkv-duo/lib/cmake/opencv4/OpenCVConfig-version.cmake inflating: opencv-mobile-4.10.0-milkv-duo/lib/cmake/opencv4/OpenCVModules.cmake inflating: opencv-mobile-4.10.0-milkv-duo/lib/cmake/opencv4/OpenCVConfig.cmake inflating: opencv-mobile-4.10.0-milkv-duo/lib/cmake/opencv4/OpenCVModules-release.cmake inflating: opencv-mobile-4.10.0-milkv-duo/lib/libopencv_photo.a creating: opencv-mobile-4.10.0-milkv-duo/include/ creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/ creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/ creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/mat.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/saturate.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/neon_utils.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/simd_intrinsics.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/bindings_utils.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/vsx_utils.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/operations.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/affine.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/instrumentation.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/allocator_stats.impl.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/tls.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/logtag.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/logger.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/trace.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/fp_control_utils.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/logger.defines.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/allocator_stats.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utils/filesystem.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/cvdef.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/types.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/core_c.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/eigen.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/persistence.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_rvv_010_compat_non-policy.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_vsx.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_msa.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_rvv.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_rvv_scalable.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_forward.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_rvv_compat_overloaded.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_rvv071.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/hal.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_wasm.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/simd_utils.impl.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/interface.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_neon.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_lsx.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_rvv_010_compat_overloaded-non-policy.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_sse_em.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_lasx.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_avx.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_avx512.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_cpp.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/msa_macros.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_sse.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/hal/intrin_rvv_011_compat.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/base.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/traits.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/sse_utils.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/dualquaternion.inl.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/utility.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/matx.inl.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/types_c.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/check.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/version.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/detail/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/detail/dispatch_helper.impl.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/detail/async_promise.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/detail/exception_ptr.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/dualquaternion.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/mat.inl.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/async.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/cv_cpu_helper.h creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/parallel/ creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/parallel/backend/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/parallel/backend/parallel_for.tbb.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/parallel/backend/parallel_for.openmp.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/parallel/parallel_backend.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/cv_cpu_dispatch.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/fast_math.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/cvstd.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/optim.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/bufferpool.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/cvstd.inl.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/quaternion.inl.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/quaternion.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/core.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/softfloat.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/matx.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core/cvstd_wrapper.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/video.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/dnn/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/dnn/dnn.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/video/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/video/tracking.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/video/video.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/video/detail/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/video/detail/tracking.detail.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/video/background_segm.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/video/legacy/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/video/legacy/constants_c.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/opencv_modules.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/features2d/ creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/features2d/hal/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/features2d/hal/interface.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/features2d/features2d.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/photo.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/features2d.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/opencv.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/core.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/highgui/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/highgui/highgui.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/cvconfig.h creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/photo/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/photo/photo.hpp creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/photo/legacy/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/photo/legacy/constants_c.h creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/ creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/hal/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/hal/hal.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/hal/interface.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/bindings.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/imgproc.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/types_c.h creating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/detail/ inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/detail/gcgraph.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/detail/legacy.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/segmentation.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/imgproc/imgproc_c.h inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/highgui.hpp inflating: opencv-mobile-4.10.0-milkv-duo/include/opencv4/opencv2/dnn.hpp ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ ls opencv-mobile-4.10.0-milkv-duo opencv-mobile-4.10.0-milkv-duo.zip opencv-mobile-4.10.0-milkv-duo.zip:Zone.Identifier ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ dir opencv-mobile-4.10.0-milkv-duo opencv-mobile-4.10.0-milkv-duo.zip opencv-mobile-4.10.0-milkv-duo.zip:Zone.Identifier ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ ls opencv-mobile-4.10.0-milkv-duo opencv-mobile-4.10.0-milkv-duo.zip opencv-mobile-4.10.0-milkv-duo.zip:Zone.Identifier ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ ls -l total 9048 drwxr-xr-x 6 ubuntu ubuntu 4096 Aug 3 06:08 opencv-mobile-4.10.0-milkv-duo -rw-r--r-- 1 ubuntu ubuntu 9254130 Sep 23 11:50 opencv-mobile-4.10.0-milkv-duo.zip -rw-r--r-- 1 ubuntu ubuntu 639 Sep 23 11:50 opencv-mobile-4.10.0-milkv-duo.zip:Zone.Identifier ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ nano main.cpp ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ ls main.cpp opencv-mobile-4.10.0-milkv-duo.zip opencv-mobile-4.10.0-milkv-duo opencv-mobile-4.10.0-milkv-duo.zip:Zone.Identifier ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ nano CMakeLists.txt ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ wget https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz --2024-09-23 11:54:21-- https://sophon-file.sophon.cn/sophon-prod-s3/drive/23/03/07/16/host-tools.tar.gz Resolving sophon-file.sophon.cn (sophon-file.sophon.cn)... 128.14.116.207 Connecting to sophon-file.sophon.cn (sophon-file.sophon.cn)|128.14.116.207|:443... connected. HTTP request sent, awaiting response... 200 OK Length: 881401141 (841M) [application/x-gzip] Saving to:host-tools.tar.gzhost-tools.tar.gz 100%[=================================================>] 840.57M 10.5MB/s in 85s 2024-09-23 11:55:49 (9.84 MB/s) -host-tools.tar.gzsaved [881401141/881401141] ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ tar -xf host-tools.tar.gz ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ mkdir build ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ cd build ubuntu@DESKTOP-UHGFA4M:~/picture-resize/build$ cmake .. -- The C compiler identification is GNU 11.4.0 -- The CXX compiler identification is GNU 11.4.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done CMake Error at CMakeLists.txt:12 (find_package): By not providing "FindOpenCV.cmake" in CMAKE_MODULE_PATH this project has asked CMake to find a package configuration file provided by "OpenCV", but CMake did not find one. Could not find a package configuration file provided by "OpenCV" with any of the following names: OpenCVConfig.cmake opencv-config.cmake Add the installation prefix of "OpenCV" to CMAKE_PREFIX_PATH or set "OpenCV_DIR" to a directory containing one of the above files. If "OpenCV" provides a separate development package or SDK, be sure it has been installed. -- Configuring incomplete, errors occurred! See also "/home/ubuntu/picture-resize/build/CMakeFiles/CMakeOutput.log". ubuntu@DESKTOP-UHGFA4M:~/picture-resize/build$ cd .. ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ nano CMakeLists.txt ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ dir CMakeLists.txt host-tools main.cpp opencv-mobile-4.10.0-milkv-duo.zip build host-tools.tar.gz opencv-mobile-4.10.0-milkv-duo opencv-mobile-4.10.0-milkv-duo.zip:Zone.Identifier ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ cd opencv-mobile-4.10.0-milkv-duo/^C ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ dir CMakeLists.txt host-tools main.cpp opencv-mobile-4.10.0-milkv-duo.zip build host-tools.tar.gz opencv-mobile-4.10.0-milkv-duo opencv-mobile-4.10.0-milkv-duo.zip:Zone.Identifier ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ nano CMakeLists.txt ubuntu@DESKTOP-UHGFA4M:~/picture-resize$ cd build ubuntu@DESKTOP-UHGFA4M:~/picture-resize/build$ cmake .. -- Found OpenCV: /home/ubuntu/picture-resize/opencv-mobile-4.10.0-milkv-duo (found version "4.10.0") -- Configuring done -- Generating done -- Build files have been written to: /home/ubuntu/picture-resize/build ubuntu@DESKTOP-UHGFA4M:~/picture-resize/build$ make [ 50%] Building CXX object CMakeFiles/opencv-mobile-test.dir/main.cpp.o [100%] Linking CXX executable opencv-mobile-test [100%] Built target opencv-mobile-test ubuntu@DESKTOP-UHGFA4M:~/picture-resize/build$ make clean ubuntu@DESKTOP-UHGFA4M:~/picture-resize/build$ make [ 50%] Building CXX object CMakeFiles/opencv-mobile-test.dir/main.cpp.o [100%] Linking CXX executable opencv-mobile-test [100%] Built target opencv-mobile-test ubuntu@DESKTOP-UHGFA4M:~/picture-resize/build$

opencv-mobile-test gerado no diretório build atual é o programa de teste:

$ ls
CMakeCache.txt CMakeFiles cmake_install.cmake Makefile opencv-mobile-test

A estrutura do diretório neste momento é a seguinte:

picture-resize/ # Test program root directory
├── build # Compile output directory
├── CMakeLists.txt # CMake configuration file
├── host-tools # Duo cross-compilation tool chain directory
├── main.cpp # Test program source code file
└── opencv-mobile-4.9.0-milkv-duo/ # opencv-mobile precompiled library directory

ubuntu@DESKTOP-UHGFA4M:~/picture-resize/build$ ls -l total 2636 -rw-r--r-- 1 ubuntu ubuntu 14069 Sep 23 12:00 CMakeCache.txt drwxr-xr-x 5 ubuntu ubuntu 4096 Sep 23 12:41 CMakeFiles -rw-r--r-- 1 ubuntu ubuntu 5298 Sep 23 12:00 Makefile -rw-r--r-- 1 ubuntu ubuntu 1630 Sep 23 12:00 cmake_install.cmake -rwxr-xr-x 1 ubuntu ubuntu 2664744 Sep 23 12:41 opencv-mobile-test ubuntu@DESKTOP-UHGFA4M:~/picture-resize/build$




Transfira o programa opencv-mobile-test gerado para o Duo através do comando  scp:

scp opencv-mobile-test root@192.168.42.1:/root/

ou


Em seguida, transfira uma imagem jpg com tamanho de 1024x1024 para teste para o Duo:

scp in.jpg root@192.168.42.1:/root/

in.jpg

Imagens de documentos

Execute o programa de teste no Duo

Cuidado

Para firmware Duo, use temporariamente a versão V1.0.8

Efetue login no terminal Duo através da porta serial ou ssh e entre no diretório /root/:

cd /root/

Adicione permissões executáveis ​​ao opencv-mobile-test:

chmod +x opencv-mobile-test

Execute o programa de teste:

./opencv-mobile-test


Se você encontrar um erro OOM, pode ser que a resolução da imagem esteja muito grande e o uso da memória exceda a memória disponível do Duo. É normal alterar a imagem para um tamanho menor.

Out of memory: Killed process 3718 (opencv-mobile-t) total-vm:31168kB, anon-rss:11384kB, file-rss:4kB, shmem-rss:0kB, UID:0

Use o comando  ls para verificar se o arquivo out.jpg foi gerado no diretório atual:

[root@milkv-duo]~# ls
in.jpg opencv-mobile-test out.jpg

Use o comando scp no computador para recuperar o arquivo out.jpg localmente e verifique se o tamanho é 200x200:

scp root@192.168.42.1:/root/out.jpg .

200x200

2. Teste de decodificação de Hardware acelerada

opencv-mobile já suporta decodificação JPG acelerada por hardware no Milk-V Duo

  1. O módulo opencv-mobile highgui carrega dinamicamente a biblioteca cvi e a decodificação de hardware JPG em tempo de execução
  2. Não há necessidade de modificar o código, cv::imread() e cv::imdecode() são suportados automaticamente
  3. Suporta rotação automática EXIF ​​e decodificação direta para escala de cinza
  4. Acelerado de 5 a 11 vezes!

Exemplo de teste

Para verificar o efeito real da aceleração de hardware JPG, você também pode usar o programa de exemplo anterior que dimensiona o arquivo jpg para 200x200 e usar o pacote pré-compilado opencv-mobile sem aceleração de hardware JPG e o pacote pré-compilado com aceleração de hardware JPG para gerar programas de teste, comparar pelo tempo de execução no Duo.

Pacote pré-compilado sem aceleração de hardware JPG: opencv-mobile-4.8.0-milkv-duo.zip

Pacote pré-compilado com aceleração de hardware JPG: opencv-mobile-4.9.0-milkv-duo.zip

Use dois pacotes pré-compilados para compilar opencv-mobile-testrespectivamente e transferi-los para o Duo para execução. Eu testei no Duo-256M aqui. in.jpgusa uma imagem com resolução de 3000x3000 e tamanho de imagem jpg de 3,2M.

[root@milkv-duo]~# time ./opencv-mobile-test-4.8.0
real 0m 2.56s
user 0m 2.31s
sys 0m 0.24s
[root@milkv-duo]~# time ./opencv-mobile-test-4.9.0
this device is not whitelisted for jpeg encoder rkmpp
real 0m 0.37s
user 0m 0.13s
sys 0m 0.14s

Pode-se observar que o tempo de execução sem aceleração de hardware JPG é 2.56s, e o tempo de execução com aceleração de hardware JPG é apenas 0.37s, o que equivale a cerca 6.92 de vezes.

Alguns detalhes e limitaçõess

Carregar biblioteca dinâmica cvi-mmf em tempo real

Para reduzir o acoplamento de compilação, o opencv-mobile usa o método dlopen/dlsym de tempo de execução para carregar libsys libvpu libae libawb libisp libcvi_bin libsns_gc2083. Mesmo se a biblioteca estiver ausente durante a compilação, ela ainda é compatível e está disponível.

Este método também pode se adaptar automaticamente a atualizações posteriores da biblioteca do sistema.

Whitetlist

O código otimizado foi verificado e testado no Milk-V Duo / Milk-V Duo-256M.

Ao carregar a biblioteca cvi-mmf, também é determinado se /proc/device-tree/model é um dispositivo Milk-V Duo e pode retornar automaticamente para a versão não otimizada em outros dispositivos.

Evite resoluções especiais

Durante o teste, descobriu-se que, em resoluções ultrapequenas (2x2) e ultra grandes (4096x4096), as imagens geralmente ficam danificadas ou o conteúdo fica distorcido, ocorrem erros de codificação e até mesmo o dispositivo é desligado devido à memória insuficiente.

Portanto, nas seguintes circunstâncias especiais, ele retornará automaticamente para a versão não otimizada:

  • w ou h não é múltiplo de 2
  • w ou h é menor que 8

Armadilhas no processo de decodificação e alinhamento de vpss

  1. Ler arquivo jpg na memória
  2. Analise o cabeçalho jpg e obtenha o método de amostragem do número do canal wh EXIF ​​e outras informações
  3. cvi-mmf prepara 3 vbuffers para vb decodificado, vb rotacionado e vb convertido por BGR
  4. vdec decodifica para yuv444/yuv422/yuv420/y
  5. vpss faz a rotação e yuv converte para nv12
  6. vpss faz conversão nv12 para bgr

Entre eles, o teste ** descobriu que o vpss tem requisitos mais altos para alinhamento de dados. Acontecerá que os dados decodificados pelo vdec são alinhados em 64 bytes, enquanto o vpss requer que os dados sejam alinhados em 128 bytes**.

Em alguns tamanhos que não são múltiplos de 128, podem ocorrer falhas de decodificação ou erros de dados de imagem decodificados:

opencv-móvel

Então eu fiz um hack no meio de vdec->vpss. Após a decodificação de vdec e antes do processamento de vpss, eu resetei o valor de phyaddr e re-memmove os dados do canal UV para atender aos requisitos de alinhamento de vpss.

Se for decodificado em escala de cinza, o vpss tratará yuv diretamente como y, o que pode acelerar a rotação.

No geral, o processo de decodificação de jpg é muito mais complicado do que a codificação, e há mais situações a serem consideradas.

8 Direção das rotações

O vdec só pode ser configurado para emitir flip/mirror, e com o vpss ele só pode fazer rotação de 90/180/270 e pode combinar 8 direções de rotação.

Como o vpss só pode rotacionar dados nv12, o canal uv decodificado pelo yuv444 será inevitavelmente subamostrado, o que é prejudicial à qualidade da imagem .

Yuv422 vertical e progressivo não são suportados .

Durante o teste, foi descoberto que yuv422 horizontal jpg pode ser decodificado normalmente, mas yuv422 vertical jpg é decodificado incorretamente por vdec. Esse tipo de jpg retornará automaticamente para decodificação de software.

Além disso, jpgs progressivos não são suportados.

Testes de desempenho

O teste lê a imagem com antecedência e chama repetidamente cv::imdecode() para decodificar JPG e eliminar a interferência da leitura e gravação do arquivo, e as estatísticas mais rápidas e demoradas são obtidas.

Teste arquivos jpg em quatro espaços de cores de YUV444 YUV422 YUV420 GREY com resolução de 720p e teste em conjunto o processo de decodificação de rotação de 90 graus de acordo com EXIF.

Teste cv::Mat decodificado para BGR e escala de cinza, respectivamente.

Testado em Milk-V Duo e Milk-V Duo-256M.

Os resultados dos testes mostram que a decodificação JPG acelerada por hardware cvi-mmf melhorou muito.

opencv-móvel

opencv-móvel

opencv-móvel

opencv-móvel

3. Teste de aceleração de Hardware VPSSeste

O opencv-mobile agora oferece suporte a câmeras MIPI CSI Milk-V Duo/Duo256M/DuoS e aceleração de hardware VPSS.

  • O módulo opencv-mobile highgui implementa acesso a fluxos de câmera com base em cvi-mmf
  • Carregue automaticamente e dinamicamente a biblioteca ae+awb+isp+cvi_bin em tempo de execução para implementar o ajuste de imagem ISP
  • Carregue automaticamente e dinamicamente a biblioteca vpss em tempo de execução para implementar a aceleração de hardware crop + YUV2BGR
  • Não há necessidade de modificar o código, chamar cv::VideoCapture automaticamente o suportará e permitirá a definição da resolução.
  • Atualmente suporta apenas a câmera oficial GC2083 da Milk-V

Exemplo de teste

  • Use cv::VideoCapture para abrir a câmera e definir a resolução para 320x240
  • Obtenha 1 quadro de imagem a cada 1 segundo
  • Desligar a câmera
  • Por fim, costure as 9 imagens e salve-as

O primeiro quadro está preto porque o ISP ainda está contando as informações da imagem e é tarde demais para processá-las automaticamente.

Código de exemplo:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

#include <unistd.h> // sleep()

int main()
{
cv::VideoCapture cap;
cap.set(cv::CAP_PROP_FRAME_WIDTH, 320);
cap.set(cv::CAP_PROP_FRAME_HEIGHT, 240);
cap.open(0);

const int w = cap.get(cv::CAP_PROP_FRAME_WIDTH);
const int h = cap.get(cv::CAP_PROP_FRAME_HEIGHT);
fprintf(stderr, "%d x %d\n", w, h);

cv::Mat bgr[9];
for (int i = 0; i < 9; i++)
{
cap >> bgr[i];

sleep(1);
}

cap.release();

// combine into big image
{
cv::Mat out(h * 3, w * 3, CV_8UC3);
bgr[0].copyTo(out(cv::Rect(0, 0, w, h)));
bgr[1].copyTo(out(cv::Rect(w, 0, w, h)));
bgr[2].copyTo(out(cv::Rect(w * 2, 0, w, h)));
bgr[3].copyTo(out(cv::Rect(0, h, w, h)));
bgr[4].copyTo(out(cv::Rect(w, h, w, h)));
bgr[5].copyTo(out(cv::Rect(w * 2, h, w, h)));
bgr[6].copyTo(out(cv::Rect(0, h * 2, w, h)));
bgr[7].copyTo(out(cv::Rect(w, h * 2, w, h)));
bgr[8].copyTo(out(cv::Rect(w * 2, h * 2, w, h)));

cv::imwrite("out.jpg", out);
}

return 0;
}

Da mesma forma, consulte o método para transferir outros arquivos compilados para o Duo para executar o comando  ./opencv-mobile-test:

dica
  • A câmera precisa estar conectada antes que o Duo seja ligado
  • Quando o comando é executado, a direção da câmera pode ser girada para capturar imagens diferentes até que o programa termine
[root@milkv-duo]~# ./opencv-mobile-test
this device is not whitelisted for jpeg encoder rkmpp
this device is not whitelisted for capture v4l2 rkaiq
this device is not whitelisted for capture v4l2 rkaiq
ISP Vipipe(0) Allocate pa(0x8bf30000) va(0x0x3fe7c50000) size(291120)
awbInit ver 6.8@2021500
0 R:1400 B:3100 CT:2850
1 R:1500 B:2500 CT:3900
2 R:2300 B:1600 CT:6500
Golden 1024 1024 1024
WB Quadratic:0
isWdr:0
ViPipe:0,===GC2083 1080P 30fps 10bit LINE Init OK!===
binName = /mnt/cfg/param/cvi_sdr_bin
********************************************************************************
cvi_bin_isp message
gerritId: 36403 commitId: c69c5863e
md5: cab880835a2ad5184de5ed7762404b84
sensorNum 1
sensorName0 2083

PQBIN message
gerritId: 80171 commitId: 5c9d8fc5d
md5: ba5a510e093ad42db6788e6c2d13169e
sensorNum 3
sensorName0 2053

author: wanqiang.he desc: 思博慧CV1812H_GC2083_RGB_mode_V1.0.0
createTime: 2023-08-04 16:48:08version: V1.1
tool Version: v3.0.5.24 mode:
********************************************************************************
sensorName(0) mismatch, mwSns:2083 != pqBinSns:2053
320 x 240
0 R:1165 B:3087 CT:2688
1 R:1464 B:2327 CT:3937
2 R:1974 B:1613 CT:7225
Golden 1464 1024 2327
wdrLEOnly:1
ISP Vipipe(0) Free pa(0x8bf30000) va(0x0x3fe7c50000)
gc2083_standby

Após a operação bem-sucedida, uma imagem out.jpg composta de 9 quadros de imagens será gerada.

[root@milkv-duo]~# ls
opencv-mobile-test out.jpg

Use o scpcomando no seu computador para recuperar o arquivo  out.jpg localmente:

scp root@192.168.42.1:/root/out.jpg .

Veja a imagem gerada out.jpg:

opencv-mobile-saída

Alguns detalhes e limitações

Carregar biblioteca dinâmica cvi-mmf em tempo realtempo de execução

Para reduzir o acoplamento de compilação, o opencv-mobile usa o método dlopen/dlsym de tempo de execução para carregar libsys libvpu libae libawb libisp libcvi_bin libsns_gc2083. Mesmo se a biblioteca estiver ausente durante a compilação, ela ainda é compatível e está disponível.

Este método também pode se adaptar automaticamente a atualizações posteriores da biblioteca do sistema.

Detecção de dispositivos e whitelisting

O código otimizado foi verificado e testado no Milk-V Duo / Milk-V Duo-256M.

Ao carregar a biblioteca cvi-mmf, determine adicionalmente se /proc/device-tree/model é um dispositivo Milk-V Duo

As interfaces cvi-mmf Milk-V Duo e Milk-V Duo-256M são compatíveis com o código-fonte, mas, na verdade, os arquivos de configuração sns ini são diferentes. Se usados ​​incorretamente, os quadros de imagem não podem ser obtidos normalmente e um erro será relatado.

isp_err_chk:6343(): CSIBDG_A CH0 frm height less than setting(1080)

Distinga dois modelos de acordo com as informações do modelo e retome o trabalho após carregar a configuração correspondente:

Resolução adaptativa

A resolução nativa da câmera é 1920x1080 30 fps.

  • Se o tamanho da solicitação do usuário exceder 1080p, o tamanho será reduzido automaticamente para dentro do intervalo de 1080p, mantendo a proporção
  • Se o usuário solicitar menos de 1080p, ele será automaticamente cortado no centro e mantido reduzido para a resolução necessária

opencv-escala-móvel

Número do pool de memória vb

Embora, em teoria, um bloco de memória possa ser reutilizado o tempo todo para fornecer busca de quadros ao NV21, durante os testes foi descoberto que, quando há poucos blocos de memória vb, ocorre um erro de exaustão de memória vb, resultando na incapacidade de buscar quadros normalmente após um período de tempo.

Consulte o código de exemplo cvi-mmf para abrir 4 blocos de memória para armazenar dados NV21, para que o problema de exaustão de vb não ocorra mais.

  1. opencv-mobile 现已支持 milkv-duo/duo256m MIPI CSI 摄像头和vpss硬件加速
  2. opencv-mobile 现已支持 milkv-duo cvi-mmf 硬件加速 JPG 解码
  3. opencv-mobile (迷你版opencv库)在 milkv-duo 上的移植和应
  4. https://milkv.io/docs/duo/resources/opencv-mobile

A SMARTCORE FORNECE CHIPS E MÓDULOS PARA IOT, COMUNICAÇÃO WIRELESS, BIOMETRIA, CONECTIVIDADE, RASTREAMENTO E AUTOMAÇÃO. NOSSO PORTFÓLIO INCLUI MODEM 2G/3G/4G/NB-IOT, SATELITAL, MÓDULOS WIFI, BLUETOOTH, GPS, SIGFOX, LORA, LEITOR DE CARTÃO, LEITOR QR CCODE, MECANISMO DE IMPRESSÃO, MINI-BOARD PC, ANTENA, PIGTAIL, BATERIA, REPETIDOR GPS E SENSORES. 

Nenhum comentário:

Postar um comentário