Python-OpenCV难道比C++_OpenCV快?以调用Canny边缘检测函数为例

如果不调用第三方库,C++比Python快很多是不争的事实,下面的这些博文都以实际例子证明了C++比Python快很多的事实。
python和C++的性能分析(寻找素数)
python运行速度和c_Python与C++之间运行速度对比
与Python的速度较量:C++究竟有多快?
Python和C语言运行速度对比(累加1亿次)

但是调用第三方库的情况可能就有所不同。
博主曾听说,我们在Python中使用的OpenCV,实际上是用C++写好的OpenCV代码进行编译得到的,本质上只是用Python调用C++程序,Python只是个壳。
如果是这样的话,那么在C++中调用OpenCV的函数应该和Python中调用OpenCV的函数耗时差不多。
那么是不是这样呢?
网上查阅了相关情况,发现还真是这样 ,比如下面这个链接中作的实验:
https://wenku.baidu.com/view/8e488521eb7101f69e3143323968011ca300f762.html
Python-OpenCV难道比C++_OpenCV快?以调用Canny边缘检测函数为例_第1张图片
博主也做了个实验,实验结果居然是Python比OpenCV快。
实验是对同样一幅图像,调用200次Canny边缘检测函数,看时间的消耗。
代码中用到的图像下载链接:
https://pan.baidu.com/s/1uxc_My59b7f9C7iJLBS3hQ?pwd=z0xn

Python代码如下:

import cv2 as cv
import sys
import datetime

image = cv.imread('F:/material/images/2022/2022-06/01_woman_samll.jpg', 0)
if image is None:
    print('Error: Could not load image')
    sys.exit()

begin1 = datetime.datetime.now()
for i in range(200):
    Canny_low = cv.Canny(image, 50, 100, apertureSize=3)
end1 = datetime.datetime.now()
# 以毫秒为单位
print('Canny(opencv-python) time consuming:{}ms'.format(1000*((end1 - begin1).total_seconds())))


C++代码如下:

#include 
#include 

using namespace cv;

int main()
{
	Mat image = imread("F:/material/images/2022/2022-06/01_woman_samll.jpg",0);
	if (image.empty())
	{
		std::cout << "Error: Could not load image" << std::endl;
		return 0;
	}

	//imshow("Source Image", image);

	Mat Canny_low;
	double begin1, end1, time1;
	begin1 = (double)getTickCount();
	const int ntimes = 200;
	for (int i = 0; i < ntimes; i++)
	{
		Canny(image, Canny_low, 50, 100, 3);
	}
	end1 = (double)getTickCount();
	time1 = 1000*(end1 - begin1) / getTickFrequency();
	std::cout << "Canny(opencv-C++) time consuming:" << time1 << "ms" << std::endl<<std::endl;

	return(0);
}

两段代码的运行结分别如下:
在这里插入图片描述
Python-OpenCV难道比C++_OpenCV快?以调用Canny边缘检测函数为例_第2张图片
这差的不是一点啊,Python用时77.77毫秒,C++用时229.84毫秒,C++用时是Python用时的229.87/77.77=3倍。

我们测一下都运行一次的时间呢,把循环次数改为1,两个的运行时间分别如下:
Python-OpenCV难道比C++_OpenCV快?以调用Canny边缘检测函数为例_第3张图片
Python-OpenCV难道比C++_OpenCV快?以调用Canny边缘检测函数为例_第4张图片
Python用时0.974毫秒,C++用时88.54毫秒,,C++用时是Python用时的88.54/0.974=90倍,这差距更大了。

什么原因造成这种情况呢?
一是因为博主的Python-OpenCV版本为OpenCV4.x,而C++中的OpenCV版本为OpenCV3.x,估计是OpenCV4.0的代码效率更高。
二是二者本质上调用的都是OpenCV官方发布的库,所以在效率基础上是没有区别的,相当于核心部分都是C++的效率。

虽然结果是这样,但是一个基础的事实还是得承认,即同样的运算逻辑,C++的效率肯定是比Python的高的。

启示:
如果要想提高自己用Python写成的图像处理代码的速度,请尽量用OpenCV的函数实现,尽量少用Python本身的运算做运算。

你可能感兴趣的:(图像处理原理,工具,代码,C/C++基础,python基础,Python-C++速度比较)