You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

OpenCV Python比C++更快?测试HoughCircle处理速度差异

测试Python与C++版本OpenCV HoughCircle的性能差异

我最近一直在做Python和C版本OpenCV中HoughCircle算法的计时测试,就是想验证直觉上C处理速度更快的猜想!先跟大家说下我的环境配置:

  • Python 3.6.4
  • GCC编译器版本:gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
  • CMake 3.5.1
  • OpenCV 3.4.1(Python版是通过Anaconda安装的,意外的是C++版也能正常跑起来)

注:原文中提到的测试图片未提供,默认使用适合圆形检测的常规图像(比如带圆形物体的场景图)

Python测试代码

我整理了完整可运行的Python测试脚本,包含计时逻辑:

import cv2
import time
import sys

def hough_transform(src, dp, minDist, param1=100, param2=100, minRadius=0, maxRadius=0):
    gray = cv2.cvtColor(src, cv2.COLOR_BGR2GRAY)
    circles = cv2.HoughCircles(gray, cv2.HOUGH_GRADIENT, dp, minDist,
                               param1=param1, param2=param2,
                               minRadius=minRadius, maxRadius=maxRadius)
    return circles

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("Usage: python hough_circle_test.py <image_path>")
        sys.exit(1)
    img_path = sys.argv[1]
    img = cv2.imread(img_path)
    if img is None:
        print("Could not read the image")
        sys.exit(1)
    
    # 计时测试
    start_time = time.time()
    circles = hough_transform(img, dp=1, minDist=20)
    end_time = time.time()
    
    print(f"Python HoughCircle execution time: {end_time - start_time:.4f} seconds")
    if circles is not None:
        print(f"Detected {len(circles[0])} circles")

C++测试代码

对应的C++版本测试代码,同样包含高精度计时:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <chrono>

using namespace cv;
using namespace std;
using namespace chrono;

vector<Vec3f> hough_transform(Mat src, double dp, double minDist, double param1=100, double param2=100, int minRadius=0, int maxRadius=0) {
    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    vector<Vec3f> circles;
    HoughCircles(gray, circles, HOUGH_GRADIENT, dp, minDist, param1, param2, minRadius, maxRadius);
    return circles;
}

int main(int argc, char** argv) {
    if (argc != 2) {
        cout << "Usage: ./hough_circle_test <image_path>" << endl;
        return -1;
    }
    Mat img = imread(argv[1]);
    if (img.empty()) {
        cout << "Could not read the image" << endl;
        return -1;
    }
    
    // 高精度计时
    auto start_time = high_resolution_clock::now();
    vector<Vec3f> circles = hough_transform(img, 1, 20);
    auto end_time = high_resolution_clock::now();
    duration<double> elapsed = end_time - start_time;
    
    cout << "C++ HoughCircle execution time: " << elapsed.count() << " seconds" << endl;
    if (!circles.empty()) {
        cout << "Detected " << circles.size() << " circles" << endl;
    }
    return 0;
}

C++编译配置(CMakeLists.txt)

为了方便编译C++代码,附上CMake配置文件:

cmake_minimum_required(VERSION 3.5)
project(hough_circle_test)

find_package(OpenCV 3.4 REQUIRED)

add_executable(hough_circle_test main.cpp)
target_link_libraries(hough_circle_test ${OpenCV_LIBS})

测试注意事项

为了让测试结果更准确、公平,建议:

  • 确保Python和C++版本使用完全相同的HoughCircle参数(dp、minDist、param1等)
  • 多次运行测试取平均值,避免单次运行的系统负载波动影响结果
  • 尝试用不同尺寸、复杂度的图片测试,覆盖更多实际场景

内容的提问来源于stack exchange,提问作者Abhijit Balaji

火山引擎 最新活动