c# - 查找图像上的区域 - 自动旋转图像 OpenCv

标签 c# c++ matlab opencv image-processing

我有一张图像,我想旋转该图像,如下所示: 旋转必须是自动的。另一方面必须计算旋转角度。

[1 - 图片]

enter image description here

对于 openCV 上的这种轮换有什么想法吗?

如何在该图像上提取一个小矩形?像这样 : (我已经用红色标记了一些区域)

[2 - 图片]

enter image description here

有没有办法在 OpenCV 上从该图像中提取该区域?

最佳答案

我不了解 openCV,但是您添加了 C# 和 C++ 标签,这让我认为您会接受可以用这些语言实现的算法。

回答你的第一个问题:

如果您的图像与您提供的图像相似,您可以执行以下操作(这些不一定是连续的步骤,它们的编号只是为了便于引用):

  1. 转换为黑白(如果您愿意,您可以仅在概念上执行此操作,方法是将像素值与阈值进行比较,如下所示)

  2. 沿着黑色轮廓以垂直、水平和对角线单像素步长移动

  3. 在旅行时记住 N 对坐标,以便 N 低于图像直线的预期最小长度(以像素为单位)(您必须调整 N:太长会给您带来太少的数据) ,太短会给你带来太多噪音)

  4. 根据当前点的坐标和后退N点的坐标,计算
    mq
    y = m x + q 如果 abs(Δx) ≤ abs(Δy)m'q' of x = m' y + q' 否则,并根据您需要的分辨率制作 4 个直方图

  5. 平滑一下直方图(例如,通过向每个 channel 添加一点其相邻 channel 的值)

  6. 找到 mm'qq' 的最大值,并且,移除 qq' 的最大值周围后,qq'< 的另外 2 个(局部)最大值;这些将是您对矩形 4 条边界线方程参数的估计,其中 m ≅ -m' (根据您想要的最终结果,您可以使用 mm' 或,例如 (m-m')/2)

  7. 找到将矩形置于所需位置的旋转或仿射变换(例如,上述两条线的交点可能必须变换到某个位置),然后应用它

第 2 点是通过在每一步中查找当前像素周围的 8 个可能的黑色像素中的第一个黑色像素(以上一步的像素结束)来完成的。例如,如果您的最后一步是在 NE(东北)方向,并且您正在围绕轮廓顺时针行驶,则您将按以下顺序探索周围环境:NW、N、NE、E、SE、S、SW(缺少 W)因为如果它是黑色的话,它就会被上一步选中)。您可以通过线扫描找到起始像素(这将使您到达E方向,或者在反向线扫描的情况下到达W方向)。

您还应该计算轮廓的长度(以步长为单位)。如果它比您期望的要短得多,您应该放弃它并再次尝试,直到找到“真实”轮廓。

关于c# - 查找图像上的区域 - 自动旋转图像 OpenCv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17632169/

相关文章:

c# - 在 C# 中每行读取一个字符串行

c# - SteamVR在统一使用FFMPEG录制时创建加载屏幕闪烁

algorithm - 实现 Harris 角点检测器

python - 滑动邻域操作 PYTHON

matlab - 如何在同一个图形上绘制三个图形?

c# - "are you missing a using directive or assembly reference?"我是还是不是?

c# - 使用 InstallUtil 工具时出现 BadImageFormatException 错误

c++ - 即使在构建后 Eclipse 也不会生成 exe 文件

c++ - 如何在 kdelib 上使用 KConfig 加载默认设置?

c++ - 如何安装 boost::contract?