OpenCV是一个非常强大的计算机视觉库,提供了许多高级的图像和视频处理功能。
vcpkg install opencv4:ARM64-windows 可以轻松编译出来
这个算是一个比较详细的英文的说明
Build OpenCV Applications with MSVC | Arm Learning Paths
还有日文版本
OpenCV v4系をARM64向けにVisual Studioでビルドして、知識0だがビルド成功して動作はした、という手順を紹介します - 新しもの好きプログラマの耳より情報ブログ
opencv的模块众多,注意到可以灵活裁剪。
第一个碰到的小问题
在x64的HOST无法编译成功ARM64EC因为protoc
install-arm64ec-windows-static-rel-out.log
[198/541] C:\WINDOWS\system32\cmd.exe /C "cd /D C:\Users\shijunz\source\repos\wps\VCPKGInstallFromManifestFile\vcpkg-wps_25.01.05\buildtree\opencv4\arm64ec-windows-static-rel\modules\dnn && C:\Users\shijunz\source\repos\wps\VCPKGInstallFromManifestFile\vcpkg-wps_25.01.05\install\arm64ec-windows-static\tools\protobuf\protoc.exe --cpp_out :C:/Users/shijunz/source/repos/wps/VCPKGInstallFromManifestFile/vcpkg-wps_25.01.05/buildtree/opencv4/arm64ec-windows-static-rel/modules/dnn -I C:/Users/shijunz/source/repos/wps/VCPKGInstallFromManifestFile/vcpkg-wps_25.01.05/buildtree/opencv4/src/4.10.0-e5bca385b2/modules/dnn/src/caffe -I C:/Users/shijunz/source/repos/wps/VCPKGInstallFromManifestFile/vcpkg-wps_25.01.05/buildtree/opencv4/src/4.10.0-e5bca385b2/modules/dnn/src/onnx -I C:/Users/shijunz/source/repos/wps/VCPKGInstallFromManifestFile/vcpkg-wps_25.01.05/buildtree/opencv4/src/4.10.0-e5bca385b2/modules/dnn/src/tensorflow C:/Users/shijunz/source/repos/wps/VCPKGInstallFromManifestFile/vcpkg-wps_25.01.05/buildtree/opencv4/src/4.10.0-e5bca385b2/modules/dnn/src/caffe/opencv-caffe.proto"
FAILED: modules/dnn/opencv-caffe.pb.h modules/dnn/opencv-caffe.pb.cc
这个错误表明在编译 OpenCV 的过程中,使用 protoc 工具生成 Protobuf 文件时失败了。原因就是确保 protoc.exe 工具的是为 arm64ec 架构编译的。他工具版本不兼容,不能在X64的HOST执行,从而导致生成失败。
或者可以尝试在protobuf的json中 改回来:"host": true
"dependencies": [
"abseil",
{
"name": "protobuf",
"host": true -->修改成false
},
protoc 的作用是将 Protobuf 的消息定义文件(.proto 文件)转换为可以在 C++ 代码中使用的头文件和源文件。这些生成的文件包含了处理 Protobuf 消息所需的所有代码
第二个问题是
链接器无法找到 _tzcnt_u32 符号。
Creating library lib\opencv_imgproc4.lib and object lib\opencv_imgproc4.exp
hough.cpp.obj : error LNK2001: unresolved external symbol _tzcnt_u32 (EC Symbol)
canny.cpp.obj : error LNK2001: unresolved external symbol _tzcnt_u32 (EC Symbol)
core: hal: disable _tzcnt_u32 for ARM64EC · opencv/opencv@e906f0f
modules/core/include/opencv2/core/hal/intrin.hpp
+1-1
Diff line change | |||
@@ -64,7 +64,7 @@ | |||
64 | 64 | namespace { | |
65 | 65 | inline unsigned int trailingZeros32(unsigned int value) { | |
66 | 66 | #if defined(_MSC_VER) | |
67 | - #if (_MSC_VER < 1700) || defined(_M_ARM) || defined(_M_ARM64) | ||
67 | + #if (_MSC_VER < 1700) || defined(_M_ARM) || defined(_M_ARM64) || defined(_M_ARM64EC) | ||
68 | 68 | unsigned long index = 0; | |
69 | 69 | _BitScanForward(&index, value); | |
70 | 70 | return (unsigned int)index; |
第三个问题是
这个log看到了
.\buildtrees\opencv4\config-arm64ec-windows-release-out.log
-- Dispatch optimization FP16 is not available, skipped
-- print baseline optimization flags: /arch:SSE /arch:SSE2
-- fix Compiler doesn't support baseline optimization flags: /arch:SSE /arch:SSE2 for arm64ec, clear
-- Performing Test HAVE_CPU_BASELINE_FLAGS
临时的workaround就粗鲁的注释跳过。
macro(ocv_compiler_optimization_options)
+ message(STATUS "print baseline optimization flags: ${CPU_BASELINE_FLAGS} ")
+ set(CPU_BASELINE_FLAGS "")
+ message(STATUS "fix Compiler doesn't support baseline optimization flags: /arch:SSE /arch:SSE2 for arm64ec, clear ${CPU_BASELINE_FLAGS} ")
set(__flags "${OPENCV_EXTRA_CXX_FLAGS} ${CPU_BASELINE_FLAGS}")