适配 opencv-mobile 无LSX编译
https://github.com/nihui/opencv-mobile
下载最新的源码包
https://github.com/nihui/opencv-mobile/releases/latest/download/opencv-mobile-4.10.0.zip
为 loongarch64 编写 cmake toolchain
set(CMAKE_SYSTEM_NAME Linux)
set(CMAKE_SYSTEM_PROCESSOR loongarch64)
if(DEFINED ENV{LOONGARCH64_ROOT_PATH})
file(TO_CMAKE_PATH $ENV{LOONGARCH64_ROOT_PATH} LOONGARCH64_ROOT_PATH)
else()
message(FATAL_ERROR "LOONGARCH64_ROOT_PATH env must be defined")
endif()
set(LOONGARCH64_ROOT_PATH ${LOONGARCH64_ROOT_PATH} CACHE STRING "root path to loongarch64 toolchain")
set(CMAKE_C_COMPILER "${LOONGARCH64_ROOT_PATH}/bin/loongarch64-linux-gnu-gcc")
set(CMAKE_CXX_COMPILER "${LOONGARCH64_ROOT_PATH}/bin/loongarch64-linux-gnu-g++")
set(CMAKE_FIND_ROOT_PATH "${LOONGARCH64_ROOT_PATH}/loongarch64-linux-gnu")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_C_FLAGS "-march=loongarch64")
set(CMAKE_CXX_FLAGS "-march=loongarch64")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS}" CACHE STRING "c flags")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}" CACHE STRING "c++ flags")
编译opencv-mobile
export LOONGARCH64_ROOT_PATH=/home/nihui/osd/loongson-gnu-toolchain-8.3-x86_64-loongarch64-linux-gnu-rc1.5
unzip -q opencv-mobile-4.10.0.zip
cd opencv-mobile-4.10.0
mkdir build
cd build
cmake -DCMAKE_TOOLCHAIN_FILE=../loongarch64-linux-gnu.toolchain.cmake -DCMAKE_INSTALL_PREFIX=`pwd`/install `cat ../options.txt` ..
make -j12
make install
编译过程中可以看到,opencv探测到了 loongarch64 lsx 指令支持,并且默认直接开启,这会导致在 2k0300 这种不支持 lsx 的平台上出错

因此,可以添加额外的参数,强制禁用 LSX LASX 优化
cmake -DCMAKE_TOOLCHAIN_FILE=../loongarch64-linux-gnu.toolchain.cmake -DCMAKE_INSTALL_PREFIX=`pwd`/install `cat ../options.txt` -DCPU_BASELINE='' -DCPU_DISPATCH='' ..
make -j12
make install

opencv-mobile 图片缩放测试
利用opencv-mobile实现图片读取,缩放,保存图片
新建一个cmake工程,引入刚才编译好的 opencv-mobile
project(opencv-mobile-test)
set(OpenCV_DIR "/home/nihui/osd/opencv-mobile-4.10.0/build/install/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)
add_executable(opencv-mobile-test main.cpp)
target_link_libraries(opencv-mobile-test ${OpenCV_LIBS})
cpp实现:读取 in.jpg 图片,缩放到240x240,保存到 out.jpg
#include
#include
#include
int main()
{
cv::Mat bgr = cv::imread("in.jpg", 1);
cv::resize(bgr, bgr, cv::Size(240, 240));
cv::imwrite("out.jpg", bgr);
return 0;
}
编译为 loongarch64 二进制,上传到开发板
cmake -DCMAKE_TOOLCHAIN_FILE=../loongarch64-linux-gnu.toolchain.cmake ..
make
scp opencv-mobile-test root@192.168.1.46:/root/
scp in.jpg root@192.168.1.46:/root/
此时在开发板上运行程序报错,找不到 libgomp.so.1
[root@LS-GD ~]# ./opencv-mobile-test
./opencv-mobile-test: error while loading shared libraries: libgomp.so.1: cannot open shared object file: No such file or directory
把 loongarch64 工具链里的 libgomp.so.1 上传到开发板上
scp $LOONGARCH64_ROOT_PATH/loongarch64-linux-gnu/sysroot/lib64/libgomp.so.1 root@192.168.1.46:/root/
设置好 LD_LIBRARY_PATH 环境变量再执行,可以正常跑完,并产生 out.jpg 图片
[root@LS-GD ~]# LD_LIBRARY_PATH=. ./opencv-mobile-test
最后把 out.jpg 下载到本地查看,确认图片确实被缩放到了 240x240 分辨率,图片内容正确
scp root@192.168.1.46:/root/out.jpg .


在开发板上查看文件大小,通过 file 命令也可以看到图片缩小了

