2

我必须开发一个强度计,它基本上可以显示均匀曝光图像的平均强度水平。随着相机焦点的改变,指针开始移动到以下显示中的正确值:

在此处输入图像描述

除此之外,文本字段还将以数字显示确切的强度值,如图所示。

到目前为止,我已经能够捕获图像并将其强度值存储在文本文件中。现在我必须开发这个动画图像。我从来没有使用 OpenCV 做过任何动画,所以我正在寻找一些想法如何使用 OpenCV 来制作这种动画。

这里有任何指示吗?

我的完整应用程序基于 Windows 窗体 (C++),我正在使用 OpenCV 执行其他
图像处理任务(此处未列出)。

注意:仪表将基本上显示均匀曝光区域的平均强度水平。

更新

我这里有一些解决方案。

因此,通过一些研究,我现在知道了算法:

θ= A * I

在哪里,

Theta= 指针旋转的角度

A = 比例因子

I= 强度等级

旋转角度将与强度水平成正比。

所以现在这是我计划的方式:

1- 使用 cvNamedWindow 创建一个新窗口

2-显示图像的静态部分,即图中的表盘,永远不变

3-显示一个指向中间的垂直指针

4- 获取强度级别 I 的值,并应用上述公式计算 Theta。

5- 根据上面计算的角度,使用 OpenCv 函数旋转指针。

有人可以验证我的理解吗?特别是请告诉我旋转指针最快的功能是什么?如果您可以进一步改进它,请告诉我。

4

1 回答 1

0

我会建议两个选项。

  1. 使用库:我在评论中链接的WxIndustrialControls之类的东西。
  2. 如果您真的想在opencv中绘制东西,请发布您到目前为止的代码,以便答案可以集中在您卡住的部分。

我还没有在opencv中绘图,但我想我找到了你需要的部分:

  • 简单的图像加载(例如 imread 或cvLoadImage
  • 绘图功能(例如fillPoly绘制你的针
  • 似乎您可以使用简单的 cvShowImage 快速更新图像,就像这个人使用相机提要一样
  • 将您的输入强度值转换为 fillPoly 的一组点的方程

请更新问题,详细说明您卡住了哪些部分。对不起,如果我链接到多个版本的 opencv 文档。我猜这些基本功能应该没关系。

更新方程:

我根本没有测试过这个,但它看起来很有趣:

假设:

  • 中心左侧 ==> 180 度
  • 中心右侧 ==> 0 度
  • 图像原点在左上角
  • 像素顺序为[column, row](即[x, y])

配置变量:

  • min_v ==> 表盘左边缘的值
  • max_v ==> 表盘右边缘的值
  • arc_size ==> 要用于强度范围的圆顶部的度数
  • 半径 ==> 从表盘顶部到虚拟圆中心的距离(更大的半径 ==> 更平的表盘)
  • top_padding ==> 笔直向上时静态图像顶部到针的距离
  • needle_l ==> 要绘制的针/多边形的长度

输入变量:

  • needle_v ==> 要表示的针的值

输出变量:

  • needle_end ==> 针的外点在您的图像坐标方面
  • needle_start ==> 针的内部点在您的图像坐标方面

计算:

为了可读性:

left_a =  90 + (arc_size / 2)             (angle for min_v)
right_a = 90 - (arc_size / 2)             (angle for max_v)
value_range = (max_v - min_v)

获取针的角度

value_proportion = (needle_v - min_v) / value_range
needle_a = left_a - (value_proportion * arc_size)

获取圆的虚拟中心(例如,您的示例图像中的中心将在图像之外)

dial_origin = [int(image_width / 2) , top_padding + radius]

获取针的起点和终点

needle_end[x] = dial_origin[x] - radius * cos(needle_a)
needle_end[y] = dial_origin[y] - radius * sin(needle_a)
needle_start[x] = dial_origin[x] - (radius - needle_l) * cos(needle_a)
needle_start[y] = dial_origin[x] - (radius - needle_l) * sin(needle_a)
于 2012-06-14T13:51:08.167 回答