Skip to main content

OpenCV RVV

OpenCV 在 RVV(RISC-V Vector)上的使用与 x86 平台基本一致,主要是库的差异。

什么是OpenCV?

OpenCV(Open Source Computer Vision Library) 是一个开源的计算机视觉和机器学习软件库,由英特尔公司发起并得到社区的广泛支持。它提供了一个跨平台的编程框架,用于实时的计算机视觉应用开发。常用于:

  • 图像处理和分析
  • 人脸检测和识别
  • 物体检测和跟踪
  • 机器学习应用
  • 视频分析
  • 相机标定和 3D 重建

C++使用

本节对比带 RVV 和不带 RVV的 resize 函数的性能表现

安装必要依赖

sudo apt install wget cmake gcc-15 g++-15

安装 opencv-spacemit

opencv-spacemit 包跟踪上游最新的RVV优化,提供在 SpacemiT riscv64 平台上的最佳性能

sudo apt update
sudo apt install opencv-spacemit

安装完成后终端打印:

==============================
How to use this custom OpenCV
==============================

Method 1: Specify OpenCV_DIR in CMakeLists.txt

set(OpenCV_DIR "/opt/opencv-spacemit/lib/cmake/opencv4")
find_package(OpenCV REQUIRED)

Method 2: Set CMAKE_PREFIX_PATH when running cmake

cmake -DCMAKE_PREFIX_PATH=/opt/opencv-spacemit ..

================================

测试图片下载

cd ~
wget https://archive.spacemit.com/spacemit-ai/BRDK/Model_Zoo/Datasets/test/obb_demo.jpg

项目结构

➜ cv_test tree -L 2 .
.
├── CMakeLists.txt
└── src
└── main.cpp # 测试程序

main.cpp

#include <opencv2/opencv.hpp>

#include <cstdlib>
#include <iomanip>
#include <iostream>
#include <string>

namespace {

void printUsage(const char* program) {
std::cout << "Usage: " << program << " [image_path] [iterations] [width] [height]\n"
<< "Defaults:\n"
<< " image_path : obb_demo.jpg\n"
<< " iterations : 1000\n"
<< " width : 640\n"
<< " height : 480\n";
}

int parsePositiveInt(const char* value, const char* name) {
char* end = nullptr;
const long parsed = std::strtol(value, &end, 10);
if (*value == '\0' || *end != '\0' || parsed <= 0) {
std::cerr << "Invalid " << name << ": " << value << '\n';
std::exit(1);
}
return static_cast<int>(parsed);
}

} // namespace

int main(int argc, char** argv) {
if (argc > 1 && (std::string(argv[1]) == "-h" || std::string(argv[1]) == "--help")) {
printUsage(argv[0]);
return 0;
}

const std::string imagePath = argc > 1 ? argv[1] : "obb_demo.jpg";
const int iterations = argc > 2 ? parsePositiveInt(argv[2], "iterations") : 1000;
const int targetWidth = argc > 3 ? parsePositiveInt(argv[3], "width") : 640;
const int targetHeight = argc > 4 ? parsePositiveInt(argv[4], "height") : 480;

if (argc > 5) {
printUsage(argv[0]);
return 1;
}

const cv::Mat input = cv::imread(imagePath, cv::IMREAD_COLOR);
if (input.empty()) {
std::cerr << "Failed to read image: " << imagePath << '\n';
return 1;
}

cv::Mat output;
const cv::Size targetSize(targetWidth, targetHeight);

for (int i = 0; i < 10; ++i) {
cv::resize(input, output, targetSize, 0.0, 0.0, cv::INTER_LINEAR);
}

const int64 start = cv::getTickCount();
for (int i = 0; i < iterations; ++i) {
cv::resize(input, output, targetSize, 0.0, 0.0, cv::INTER_LINEAR);
}
const int64 end = cv::getTickCount();

const double totalMs = (end - start) * 1000.0 / cv::getTickFrequency();
const double avgMs = totalMs / iterations;
const double fps = 1000.0 / avgMs;

std::cout << std::fixed << std::setprecision(3)
<< "Input image : " << imagePath << " (" << input.cols << "x" << input.rows << ")\n"
<< "Output size : " << targetWidth << "x" << targetHeight << '\n'
<< "Iterations : " << iterations << '\n'
<< "Total time : " << totalMs << " ms\n"
<< "Average : " << avgMs << " ms/resize\n"
<< "Throughput : " << fps << " resize/s\n";

return 0;
}

CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
project(opencv_resize_benchmark LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(OpenCV REQUIRED)

add_executable(resize_benchmark src/main.cpp)
target_link_libraries(resize_benchmark PRIVATE ${OpenCV_LIBS})
target_include_directories(resize_benchmark PRIVATE ${OpenCV_INCLUDE_DIRS})

本文顶层目录路径默认为 ~/cv_test

带 RVV 编译测试

cd ~/cv_test
mkdir build && cd build
cmake -DCMAKE_PREFIX_PATH=/opt/opencv-spacemit ..

终端打印如下:

cmake -DCMAKE_PREFIX_PATH=/opt/opencv-spacemit ..
-- The CXX compiler identification is GNU 15.2.0
-- 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
-- Found OpenCV: /opt/opencv-spacemit (found version "4.14.0")
-- Configuring done (0.6s)
-- Generating done (0.0s)
-- Build files have been written to: /home/bianbu26/cv_test/build

编译:

make

开启测试:

./resize_benchmark ~/obb_demo.jpg

终端打印如下:

不带 RVV 编译测试

安装系统 OpenCV库

sudo apt install libopencv-dev

测试完成后,如需恢复为优先使用 opencv-spacemit 的环境,可卸载系统 OpenCV:

sudo apt remove libopencv-dev
sudo apt autoremove

配置

cd ~/cv_test
rm -rf build
mkdir build && cd build
cmake ..

终端打印

cmake ..
-- The CXX compiler identification is GNU 15.2.0
-- 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
-- Found OpenCV: /usr (found version "4.10.0")
-- Configuring done (0.6s)
-- Generating done (0.0s)
-- Build files have been written to: /home/bianbu26/cv_test/build

编译

make

开启测试

./resize_benchmark ~/obb_demo.jpg

终端打印如下

可以看出,RVV 加速的 OpenCV 库性能相比于系统自带的 OpenCV 库有明显提升(1.293ms -> 0.478ms)

Python使用

安装必要依赖

sudo apt install python3-venv python3-pip

设置 SpacemiT 源

pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/
pip config set global.extra-index-url https://git.spacemit.com/api/v4/projects/33/packages/pypi/simple

创建虚拟环境

python3 -m venv ~/cv_venv

安装 opencv-python

source ~/cv_venv/bin/activate
pip install opencv-python

终端打印

➜ ~ source ~/cv_venv/bin/activate
pip install opencv-python
Looking in indexes: https://mirrors.aliyun.com/pypi/simple/, https://git.spacemit.com/api/v4/projects/33/packages/pypi/simple
Collecting opencv-python
Downloading https://git.spacemit.com/api/v4/projects/33/packages/pypi/files/21718d6ed9cc3558fa3cc3dde26496ff8739e58d5b7b1d4e7b4f7a34e8ca947c/opencv_python-4.13.0.92-cp39-abi3-linux_riscv64.whl (91.2 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 91.2/91.2 MB 588.5 kB/s eta 0:00:00
Collecting numpy>=2 (from opencv-python)
Downloading https://git.spacemit.com/api/v4/projects/33/packages/pypi/files/6121ae6d6bbaf9b1f26d98af46100529679020759bbd1c1cb8d0f29fdf2ec941/numpy-2.4.6-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_41_riscv64.whl (11.1 MB)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.1/11.1 MB 657.3 kB/s eta 0:00:00
Installing collected packages: numpy, opencv-python
Successfully installed numpy-2.4.6 opencv-python-4.13.0.92

测试

测试代码:

main.py

import argparse
import sys
import time

import cv2

def positive_int(value: str) -> int:
try:
parsed = int(value)
except ValueError:
raise argparse.ArgumentTypeError(f"invalid positive int value: {value}")

if parsed <= 0:
raise argparse.ArgumentTypeError(f"invalid positive int value: {value}")
return parsed

def parse_args() -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Benchmark OpenCV resize performance.",
formatter_class=argparse.RawTextHelpFormatter,
)
parser.add_argument("image_path", nargs="?", default="obb_demo.jpg")
parser.add_argument("iterations", nargs="?", type=positive_int, default=1000)
parser.add_argument("width", nargs="?", type=positive_int, default=640)
parser.add_argument("height", nargs="?", type=positive_int, default=480)
return parser.parse_args()

def main() -> int:
args = parse_args()

input_image = cv2.imread(args.image_path, cv2.IMREAD_COLOR)
if input_image is None:
print(f"Failed to read image: {args.image_path}", file=sys.stderr)
return 1

target_size = (args.width, args.height)
output_image = None

for _ in range(10):
output_image = cv2.resize(input_image, target_size, interpolation=cv2.INTER_LINEAR)

start = time.perf_counter()
for _ in range(args.iterations):
output_image = cv2.resize(input_image, target_size, interpolation=cv2.INTER_LINEAR)
end = time.perf_counter()

if output_image is None:
return 1

total_ms = (end - start) * 1000.0
avg_ms = total_ms / args.iterations
fps = 1000.0 / avg_ms

height, width = input_image.shape[:2]
print(f"Input image : {args.image_path} ({width}x{height})")
print(f"Output size : {args.width}x{args.height}")
print(f"Iterations : {args.iterations}")
print(f"Total time : {total_ms:.3f} ms")
print(f"Average : {avg_ms:.3f} ms/resize")
print(f"Throughput : {fps:.3f} resize/s")

return 0

if __name__ == "__main__":
raise SystemExit(main())
source ~/cv_venv/bin/activate
python main.py ~/obb_demo.jpg

结果如下:

更多OpenCV性能测试数据

单核对比

  • 使用 OPENCV_FOR_THREADS_NUM=1 OMP_NUM_THREADS=1 OPENBLAS_NUM_THREADS=1 MKL_NUM_THREADS=1 taskset -c 7 限制线程和核数
  • 计时策略是跑 100 次取平均值,预热10次
  • no_rvv_avg_ms 表示的是系统 libopencv-dev 包的表现
  • rvv_avg_ms 表示的是 opencv-spacemit 包的表现
modulefunctionapiinput_sizeoutput_sizeno_rvv_avg_msrvv_avg_msspeedup
imgprocresize_linearcv::resize(INTER_LINEAR)1280x720224x2240.87420.49271.7743x
imgprocresize_linearcv::resize(INTER_LINEAR)1280x720320x3201.75561.01531.7291x
imgprocresize_linearcv::resize(INTER_LINEAR)1280x720640x6405.51753.72991.4793x
imgprocresize_linearcv::resize(INTER_LINEAR)1280x720512x5123.82472.42101.5798x
imgprocresize_linearcv::resize(INTER_LINEAR)1280x7201024x102411.81059.46651.2476x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x1080224x2240.91170.53341.7092x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x1080320x3201.86851.15151.6227x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x1080640x6406.52354.05681.6080x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x1080512x5124.55912.81631.6188x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x10801024x102414.21149.54841.4884x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x1440224x2240.97620.68851.4179x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x1440320x3201.91861.30321.4722x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x1440640x6407.14104.50581.5848x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x1440512x5124.64762.99591.5513x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x14401024x102415.78619.82491.6067x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x2160224x2241.16421.03241.1277x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x2160320x3202.06801.68271.2290x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x2160640x6407.29734.68381.5580x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x2160512x5124.76583.22111.4796x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x21601024x102418.530110.92811.6956x
imgprocresize_linearcv::resize(INTER_LINEAR)640x480224x2240.86160.47401.8177x
imgprocresize_linearcv::resize(INTER_LINEAR)640x480320x3201.54430.94491.6344x
imgprocresize_linearcv::resize(INTER_LINEAR)640x480640x6404.61223.69421.2485x
imgprocresize_linearcv::resize(INTER_LINEAR)640x480512x5123.30792.37301.3940x
imgprocresize_linearcv::resize(INTER_LINEAR)640x4801024x102410.00309.44981.0585x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)224x224224x2240.09560.01655.7939x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)320x320320x3200.19440.02806.9429x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)640x640640x6400.76150.10617.1772x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)512x512512x5120.48970.06837.1698x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)1024x10241024x10241.95310.35985.4283x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)224x224224x2240.11190.04872.2977x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)320x320320x3200.22750.09112.4973x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)640x640640x6400.88930.35372.5143x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)512x512512x5120.57150.22772.5099x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)1024x10241024x10242.26870.91842.4703x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)224x224224x2240.15620.04593.4031x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)320x320320x3200.32120.08763.6667x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)640x640640x6401.23230.34783.5431x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)512x512512x5120.78790.22323.5300x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)1024x10241024x10243.17610.93043.4137x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage224x2241x3x224x2240.88130.16605.3090x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage320x3201x3x320x3201.78520.33575.3178x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage640x6401x3x640x6407.34171.38835.2883x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage512x5121x3x512x5124.64500.89785.1738x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage1024x10241x3x1024x102435.34323.511910.0638x
coremean_std_normalizecv::subtract + cv::divide224x224224x2241.87951.80571.0409x
coremean_std_normalizecv::subtract + cv::divide320x320320x3203.82723.67041.0427x
coremean_std_normalizecv::subtract + cv::divide640x640640x64015.359814.78641.0388x
coremean_std_normalizecv::subtract + cv::divide512x512512x5129.84669.44381.0427x
coremean_std_normalizecv::subtract + cv::divide1024x10241024x102439.229737.81761.0373x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(3224x224224x2240.68910.14764.6687x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(3320x320320x3201.39290.29314.7523x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(3640x640640x6405.51611.04805.2635x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(3512x512512x5123.53830.78934.4828x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(31024x10241024x102414.10174.14393.4030x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)224x224288x2880.03020.02191.3790x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)320x320384x3840.04980.03731.3351x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)640x640704x7040.14480.11871.2199x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)512x512576x5760.10060.08021.2544x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)1024x10241088x10880.40030.37291.0735x
coresplit_channelscv::split224x224224x2240.10560.01546.8571x
coresplit_channelscv::split320x320320x3200.20960.02657.9094x
coresplit_channelscv::split640x640640x6400.78220.09897.9090x
coresplit_channelscv::split512x512512x5120.50510.06397.9045x
coresplit_channelscv::split1024x10241024x10241.99770.35465.6337x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)224x224224x2240.21120.13091.6134x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)320x320320x3200.42480.25681.6542x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)640x640640x6401.62960.98851.6486x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)512x512512x5121.05220.62981.6707x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)1024x10241024x10244.15452.60751.5933x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)224x224224x2242.28490.173913.1392x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)320x320320x3204.65800.352313.2217x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)640x640640x64018.82231.407713.3710x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)512x512512x51212.01540.901313.3312x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)1024x10241024x102448.07013.643713.1927x
corecartToPolarcv::cartToPolar224x224224x2240.76940.22753.3820x
corecartToPolarcv::cartToPolar320x320320x3201.56770.46093.4014x
corecartToPolarcv::cartToPolar640x640640x6406.24921.84393.3891x
corecartToPolarcv::cartToPolar512x512512x5123.99601.17813.3919x
corecartToPolarcv::cartToPolar1024x10241024x102415.89544.73433.3575x
corecomparecv::compare(CMP_GT)224x224224x2240.05170.01224.2377x
corecomparecv::compare(CMP_GT)320x320320x3200.09680.02024.7921x
corecomparecv::compare(CMP_GT)640x640640x6400.37400.06425.8255x
corecomparecv::compare(CMP_GT)512x512512x5120.24080.04295.6131x
corecomparecv::compare(CMP_GT)1024x10241024x10240.94860.15096.2863x
coredividecv::divide(Scalar)224x224224x2241.59251.63170.9760x
coredividecv::divide(Scalar)320x320320x3203.24873.32410.9773x
coredividecv::divide(Scalar)640x640640x64013.013213.32810.9764x
coredividecv::divide(Scalar)512x512512x5128.31888.51620.9768x
coredividecv::divide(Scalar)1024x10241024x102433.266634.06280.9766x
coredotMat::dot224x2241x10.20140.03475.8040x
coredotMat::dot320x3201x10.41100.07115.7806x
coredotMat::dot640x6401x11.65710.56972.9087x
coredotMat::dot512x5121x11.05300.24624.2770x
coredotMat::dot1024x10241x14.23661.50422.8165x
coredftcv::dft224x224224x2241.02082.31280.4414x
coredftcv::dft320x320320x3201.76182.04570.8612x
coredftcv::dft640x640640x6407.84318.16150.9610x
coredftcv::dft512x512512x5124.70815.08370.9261x
coredftcv::dft1024x10241024x102435.011440.79550.8582x
coreexpcv::exp224x224224x2243.50220.280912.4678x
coreexpcv::exp320x320320x3207.14330.570712.5167x
coreexpcv::exp640x640640x64028.58792.301812.4198x
coreexpcv::exp512x512512x51218.29071.468312.4571x
coreexpcv::exp1024x10241024x102473.15005.874012.4532x
coreflip_horizontalcv::flip(1)224x224224x2240.13850.02256.1556x
coreflip_horizontalcv::flip(1)320x320320x3200.27790.03458.0551x
coreflip_horizontalcv::flip(1)640x640640x6401.09310.13318.2126x
coreflip_horizontalcv::flip(1)512x512512x5120.70380.08578.2124x
coreflip_horizontalcv::flip(1)1024x10241024x10242.83000.41536.8144x
coreLUT_invertcv::LUT224x224224x2240.20770.03615.7535x
coreLUT_invertcv::LUT320x320320x3200.42160.07315.7674x
coreLUT_invertcv::LUT640x640640x6401.69240.28345.9718x
coreLUT_invertcv::LUT512x512512x5121.08340.18205.9527x
coreLUT_invertcv::LUT1024x10241024x10244.33930.73845.8766x
coreminMaxLoccv::minMaxLoc224x2241x10.09210.004122.4634x
coreminMaxLoccv::minMaxLoc320x3201x10.18790.008123.1975x
coreminMaxLoccv::minMaxLoc640x6401x10.74720.030024.9067x
coreminMaxLoccv::minMaxLoc512x5121x10.47930.019524.5795x
coreminMaxLoccv::minMaxLoc1024x10241x11.91310.075425.3727x
imgprocremap_identitycv::remap(INTER_LINEAR)224x224224x2242.17250.60943.5650x
imgprocremap_identitycv::remap(INTER_LINEAR)320x320320x3204.42581.24013.5689x
imgprocremap_identitycv::remap(INTER_LINEAR)640x640640x64017.79096.53142.7239x
imgprocremap_identitycv::remap(INTER_LINEAR)512x512512x51211.36233.35673.3850x
imgprocremap_identitycv::remap(INTER_LINEAR)1024x10241024x102445.547016.72972.7225x
coretransposecv::transpose224x224224x2240.08650.06471.3369x
coretransposecv::transpose320x320320x3200.17710.13491.3128x
coretransposecv::transpose640x640640x6401.03960.86841.1971x
coretransposecv::transpose512x512512x5120.76040.65681.1577x
coretransposecv::transpose1024x10241024x10245.04114.75571.0600x
imgprocCannycv::Canny224x224224x2241.08120.65291.6560x
imgprocCannycv::Canny320x320320x3201.99071.11201.7902x
imgprocCannycv::Canny640x640640x6406.66573.06252.1766x
imgprocCannycv::Canny512x512512x5124.45742.16522.0587x
imgprocCannycv::Canny1024x10241024x102415.63146.47342.4147x
imgprocerode_dilatecv::erode + cv::dilate224x224224x2240.54170.17443.1061x
imgprocerode_dilatecv::erode + cv::dilate320x320320x3201.02220.28623.5716x
imgprocerode_dilatecv::erode + cv::dilate640x640640x6403.69230.74484.9574x
imgprocerode_dilatecv::erode + cv::dilate512x512512x5122.41590.52884.5686x
imgprocerode_dilatecv::erode + cv::dilate1024x10241024x10248.96982.23364.0158x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp224x224224x2240.60360.46761.2908x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp320x320320x3201.21930.86771.4052x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp640x640640x6404.79393.41661.4031x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp512x512512x5123.07982.19361.4040x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp1024x10241024x102412.22478.70921.4037x

八核对比

  • 不限制线程数和核数
  • 计时策略是跑 100 次取平均值,预热10次
  • no_rvv_avg_ms 表示的是系统 libopencv-dev 包的表现
  • rvv_avg_ms 表示的是 opencv-spacemit 包的表现
modulefunctionapiinput_sizeoutput_sizeno_rvv_avg_msrvv_avg_msspeedup
imgprocresize_linearcv::resize(INTER_LINEAR)1280x720224x2240.87250.10818.0712x
imgprocresize_linearcv::resize(INTER_LINEAR)1280x720320x3200.92570.18265.0696x
imgprocresize_linearcv::resize(INTER_LINEAR)1280x720640x6401.03970.51102.0346x
imgprocresize_linearcv::resize(INTER_LINEAR)1280x720512x5121.03220.42552.4259x
imgprocresize_linearcv::resize(INTER_LINEAR)1280x7201024x10241.71101.28171.3349x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x1080224x2240.90790.12307.3813x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x1080320x3200.95230.20134.7308x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x1080640x6401.20410.56532.1300x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x1080512x5121.21840.41412.9423x
imgprocresize_linearcv::resize(INTER_LINEAR)1920x10801024x10242.27131.31771.7237x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x1440224x2240.97040.15166.4011x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x1440320x3200.97570.21834.4695x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x1440640x6401.38311.23631.1187x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x1440512x5121.28820.77921.6532x
imgprocresize_linearcv::resize(INTER_LINEAR)2560x14401024x10242.36851.48751.5923x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x2160224x2241.17520.20995.5989x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x2160320x3201.10780.30853.5909x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x2160640x6401.47021.07981.3615x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x2160512x5121.36150.75371.8064x
imgprocresize_linearcv::resize(INTER_LINEAR)3840x21601024x10242.85751.88921.5125x
imgprocresize_linearcv::resize(INTER_LINEAR)640x480224x2240.86180.09119.4599x
imgprocresize_linearcv::resize(INTER_LINEAR)640x480320x3200.80840.14795.4659x
imgprocresize_linearcv::resize(INTER_LINEAR)640x480640x6400.87570.50491.7344x
imgprocresize_linearcv::resize(INTER_LINEAR)640x480512x5120.90780.33302.7261x
imgprocresize_linearcv::resize(INTER_LINEAR)640x4801024x10241.46041.35871.0749x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)224x224224x2240.09570.01705.6294x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)320x320320x3200.10650.02853.7368x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)640x640640x6400.16110.10861.4834x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)512x512512x5120.13720.06852.0029x
imgproccvtColor_bgr2rgbcv::cvtColor(COLOR_BGR2RGB)1024x10241024x10240.38920.40420.9629x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)224x224224x2240.11240.03103.6258x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)320x320320x3200.12100.03953.0633x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)640x640640x6400.17120.07562.2646x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)512x512512x5120.15530.04663.3326x
imgproccvtColor_bgr2graycv::cvtColor(COLOR_BGR2GRAY)1024x10241024x10240.44990.15282.9444x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)224x224224x2240.16080.04653.4581x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)320x320320x3200.31300.08843.5407x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)640x640640x6401.27580.35003.6451x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)512x512512x5120.82130.22563.6405x
corenormalize_uint8_to_fp32Mat::convertTo(CV_32FC3)1024x10241024x10243.03130.89453.3888x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage224x2241x3x224x2240.88290.16635.3091x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage320x3201x3x320x3201.78790.33615.3195x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage640x6401x3x640x6407.47181.38435.3975x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage512x5121x3x512x5124.67660.90205.1847x
dnnblobFromImage_bgr_fp32cv::dnn::blobFromImage1024x10241x3x1024x102435.53563.520710.0933x
coremean_std_normalizecv::subtract + cv::divide224x224224x2241.87861.80281.0420x
coremean_std_normalizecv::subtract + cv::divide320x320320x3203.82913.66251.0455x
coremean_std_normalizecv::subtract + cv::divide640x640640x64015.627914.76441.0585x
coremean_std_normalizecv::subtract + cv::divide512x512512x51210.27649.43361.0893x
coremean_std_normalizecv::subtract + cv::divide1024x10241024x102439.582937.77461.0479x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(3224x224224x2240.11670.03573.2689x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(3320x320320x3200.21550.07103.0352x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(3640x640640x6400.74130.22513.2932x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(3512x512512x5120.91230.16785.4368x
imgprocgaussian_blur_3x3cv::GaussianBlur(Size(31024x10241024x10241.84351.09251.6874x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)224x224288x2880.03030.02231.3587x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)320x320384x3840.04960.03751.3227x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)640x640704x7040.14840.11881.2492x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)512x512576x5760.10020.08061.2432x
corecopy_make_border_32cv::copyMakeBorder(BORDER_CONSTANT)1024x10241088x10880.40160.34861.1520x
coresplit_channelscv::split224x224224x2240.09810.01546.3701x
coresplit_channelscv::split320x320320x3200.19660.02747.1752x
coresplit_channelscv::split640x640640x6400.78090.09777.9928x
coresplit_channelscv::split512x512512x5120.50080.06287.9745x
coresplit_channelscv::split1024x10241024x10241.99960.35405.6486x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)224x224224x2240.21150.06973.0344x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)320x320320x3200.28920.09053.1956x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)640x640640x6400.68440.20533.3337x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)512x512512x5120.50920.14093.6139x
imgprocthreshold_otsu_graycv::threshold(THRESH_OTSU)1024x10241024x10241.56120.59832.6094x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)224x224224x2242.30380.175913.0972x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)320x320320x3204.69960.354413.2607x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)640x640640x64018.79631.409113.3392x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)512x512512x51212.02760.900713.3536x
coreaddWeighted_segmentation_maskcv::addWeighted(mask overlay)1024x10241024x102448.19723.635313.2581x
corecartToPolarcv::cartToPolar224x224224x2240.77030.22763.3844x
corecartToPolarcv::cartToPolar320x320320x3201.57600.46143.4157x
corecartToPolarcv::cartToPolar640x640640x6406.35271.84923.4354x
corecartToPolarcv::cartToPolar512x512512x5124.11581.17763.4951x
corecartToPolarcv::cartToPolar1024x10241024x102416.02524.73533.3842x
corecomparecv::compare(CMP_GT)224x224224x2240.05140.01234.1789x
corecomparecv::compare(CMP_GT)320x320320x3200.09660.02014.8060x
corecomparecv::compare(CMP_GT)640x640640x6400.37330.06216.0113x
corecomparecv::compare(CMP_GT)512x512512x5120.24010.04155.7855x
corecomparecv::compare(CMP_GT)1024x10241024x10240.94410.14916.3320x
coredividecv::divide(Scalar)224x224224x2241.59291.63110.9766x
coredividecv::divide(Scalar)320x320320x3203.24713.32240.9773x
coredividecv::divide(Scalar)640x640640x64013.001913.31330.9766x
coredividecv::divide(Scalar)512x512512x5128.31388.50930.9770x
coredividecv::divide(Scalar)1024x10241024x102433.361734.03910.9801x
coredotMat::dot224x2241x10.20320.03565.7079x
coredotMat::dot320x3201x10.41190.07105.8014x
coredotMat::dot640x6401x11.66600.61302.7178x
coredotMat::dot512x5121x11.06150.27443.8684x
coredotMat::dot1024x10241x14.26061.62102.6284x
coredftcv::dft224x224224x2241.02492.30670.4443x
coredftcv::dft320x320320x3201.76252.02840.8689x
coredftcv::dft640x640640x6407.82988.09860.9668x
coredftcv::dft512x512512x5124.74975.06030.9386x
coredftcv::dft1024x10241024x102432.939742.48810.7753x
coreexpcv::exp224x224224x2243.50000.280612.4733x
coreexpcv::exp320x320320x3207.14050.570912.5074x
coreexpcv::exp640x640640x64028.58762.302112.4181x
coreexpcv::exp512x512512x51218.28881.466712.4694x
coreexpcv::exp1024x10241024x102473.16205.879312.4440x
coreflip_horizontalcv::flip(1)224x224224x2240.13730.02216.2127x
coreflip_horizontalcv::flip(1)320x320320x3200.27780.03448.0756x
coreflip_horizontalcv::flip(1)640x640640x6401.09560.13428.1639x
coreflip_horizontalcv::flip(1)512x512512x5120.70460.08598.2026x
coreflip_horizontalcv::flip(1)1024x10241024x10242.82360.43056.5589x
coreLUT_invertcv::LUT224x224224x2240.20810.03615.7645x
coreLUT_invertcv::LUT320x320320x3200.42140.037211.3280x
coreLUT_invertcv::LUT640x640640x6400.31000.08163.7990x
coreLUT_invertcv::LUT512x512512x5120.28770.05954.8353x
coreLUT_invertcv::LUT1024x10241024x10240.63990.17553.6462x
coreminMaxLoccv::minMaxLoc224x2241x10.09230.004221.9762x
coreminMaxLoccv::minMaxLoc320x3201x10.18880.008422.4762x
coreminMaxLoccv::minMaxLoc640x6401x10.74800.030324.6865x
coreminMaxLoccv::minMaxLoc512x5121x10.47930.019724.3299x
coreminMaxLoccv::minMaxLoc1024x10241x11.91190.075725.2563x
imgprocremap_identitycv::remap(INTER_LINEAR)224x224224x2242.11890.36915.7407x
imgprocremap_identitycv::remap(INTER_LINEAR)320x320320x3202.17590.52124.1748x
imgprocremap_identitycv::remap(INTER_LINEAR)640x640640x6403.08621.01333.0457x
imgprocremap_identitycv::remap(INTER_LINEAR)512x512512x5122.86690.60354.7505x
imgprocremap_identitycv::remap(INTER_LINEAR)1024x10241024x10246.12712.35302.6040x
coretransposecv::transpose224x224224x2240.08670.06521.3298x
coretransposecv::transpose320x320320x3200.17630.13451.3108x
coretransposecv::transpose640x640640x6401.00950.86451.1677x
coretransposecv::transpose512x512512x5120.78590.66021.1904x
coretransposecv::transpose1024x10241024x10245.05814.69021.0784x
imgprocCannycv::Canny224x224224x2240.35600.24361.4614x
imgprocCannycv::Canny320x320320x3200.58870.41151.4306x
imgprocCannycv::Canny640x640640x6401.47901.19271.2400x
imgprocCannycv::Canny512x512512x5121.05790.82491.2825x
imgprocCannycv::Canny1024x10241024x10243.23672.46331.3140x
imgprocerode_dilatecv::erode + cv::dilate224x224224x2240.54100.07087.6412x
imgprocerode_dilatecv::erode + cv::dilate320x320320x3201.02290.10439.8073x
imgprocerode_dilatecv::erode + cv::dilate640x640640x6403.68970.264313.9603x
imgprocerode_dilatecv::erode + cv::dilate512x512512x5122.41830.200512.0613x
imgprocerode_dilatecv::erode + cv::dilate1024x10241024x10248.97300.616814.5477x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp224x224224x2240.40200.23861.6848x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp320x320320x3200.78460.45261.7335x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp640x640640x6402.99321.77141.6897x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp512x512512x5122.00031.19141.6789x
imgprocpyrDown_pyrUpcv::pyrDown + cv::pyrUp1024x10241024x10247.77474.41341.7616x