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




