opencv的getTickCount()用法

转载地址: https://blog.csdn.net/chaipp0607/article/details/71056580
double t1 = (double)getTickCount();
.
.
.
double t2 = (double)getTickCount();
cout<<"time:"<<(t2-t1)*1000/(getTickFrequency())<<endl;
   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

getTickCount()与getTickFrequency()都被定义在core.hpp文件下:

//! Returns the number of ticks.

/*!
  The function returns the number of ticks since the certain event (e.g. when the machine was turned on).
  It can be used to initialize cv::RNG or to measure a function execution time by reading the tick count
  before and after the function call. The granularity of ticks depends on the hardware and OS used. Use
  cv::getTickFrequency() to convert ticks to seconds.
*/
CV_EXPORTS_W int64 getTickCount();

/*!
  Returns the number of ticks per seconds.

  The function returns the number of ticks (as returned by cv::getTickCount()) per second.
  The following code computes the execution time in milliseconds:

  \code
  double exec_time = (double)getTickCount();
  // do something ...
  exec_time = ((double)getTickCount() - exec_time)*1000./getTickFrequency();
  \endcode
*/
CV_EXPORTS_W double getTickFrequency();

/*!
  Returns the number of CPU ticks.

  On platforms where the feature is available, the function returns the number of CPU ticks
  since the certain event (normally, the system power-on moment). Using this function
  one can accurately measure the execution time of very small code fragments,
  for which cv::getTickCount() granularity is not enough.
*/
CV_EXPORTS_W int64 getCPUTickCount();

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

getTickCount():用于返回从操作系统启动到当前所经的计时周期数,看名字也很好理解,get Tick Count(s)。
getTickFrequency():用于返回CPU的频率。get Tick Frequency。这里的单位是秒,也就是一秒内重复的次数。

所以剩下的就很清晰了:
总次数/一秒内重复的次数 = 时间(s)
1000 *总次数/一秒内重复的次数= 时间(ms)

这个逻辑很清晰,没什么问题,但是这里有一个小坑,那就是C版本的cvGetTickFrequency()函数和C++版本的getTickFrequency()的单位不一样,前者以ms计算频率,后者以s为单位计算频率,所以如果使用C版本的cvGetTickFrequency()计算时间的话,应该是:
总次数/一秒内重复的次数*1000 = 时间(ms)
总次数/一秒内重复的次数*1000000 = 时间(s)

        <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
            </div>
<think>好的,用户想用OpenCV检测或计算图片的光强度。首先,我需要回忆一下OpenCV的相关功能和常见的亮度检测方法。根据之前的知识,光强度检测通常可以通过计算图像的平均亮度来实现,或者分析直方图,或者使用HSV颜色空间中的V通道。 接下来,我需要查看用户提供的引用内容。引用[1]提到用Python和OpenCV检测图像中的多个亮点,这可能涉及到阈值处理或亮度筛选。引用[2]中的OpenCV计时器可能和性能优化有关,但用户的问题是关于亮度检测的,所以暂时可以忽略这部分。引用[3]是关于基于颜色识别的目标检测,使用了HSV颜色空间转换,这可能相关,因为HSV中的V通道代表亮度。 那么,可能的步骤包括: 1. 将图像转换为灰度图,计算平均像素值作为整体亮度。 2. 转换为HSV颜色空间,提取V通道进行分析。 3. 使用直方图统计亮度分布,比如计算平均亮度或峰值。 4. 检测局部亮点,可能需要二值化或阈值处理,如引用[1]中的方法。 5. 结合引用[3]的HSV转换方法,处理V通道来识别亮度区域。 需要注意的问题:不同方法的应用场景,比如整体亮度与局部亮点的区别。还要确保代码示例正确,比如正确使用cv2.cvtColor、cv2.mean等函数。可能需要提到性能优化,如引用[2]中的计时方法,但用户的问题主要是检测方法,所以可能作为补充建议。 然后,用户可能需要了解如何具体实现这些步骤,所以需要分步骤说明,并给出代码示例。例如,灰度图的平均亮度计算,HSV的V通道平均,直方图分析,以及亮点检测的方法。 最后,生成相关问题,考虑用户可能的后续疑问,比如性能优化、实时处理、多区域检测等。</think>根据OpenCV的光强度检测需求,可通过以下方法实现: ### 一、整体亮度检测 1. **灰度图均值法**:将图像转换为灰度图后计算平均像素值 ```python import cv2 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) brightness = cv2.mean(gray)[0] # 返回范围0-255 ``` 2. **HSV颜色空间法**:通过V通道(亮度分量)计算整体亮度[^3] ```python hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) v_channel = hsv[:,:,2] v_mean = cv2.mean(v_channel)[0] # 返回范围0-255 ``` ### 二、局部亮度分析 1. **高光区域检测**(基于引用[1]方法): ```python gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) thresh = cv2.threshold(gray, 220, 255, cv2.THRESH_BINARY)[1] # 设置高亮度阈值 contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) ``` 2. **多区域亮度统计**: ```python mask = cv2.inRange(v_channel, 200, 255) # 筛选高亮度区域 bright_spots = cv2.bitwise_and(img, img, mask=mask) ``` ### 三、亮度直方图分析 ```python hist = cv2.calcHist([v_channel], [0], None, [256], [0,256]) peak_value = np.argmax(hist) # 出现频率最高的亮度值 ``` ### 四、性能优化建议(基于引用[2]) ```python start = cv2.getTickCount() # 执行亮度检测代码 duration = (cv2.getTickCount()-start)/cv2.getTickFrequency() print(f"耗时:{duration:.4f}秒") ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值