我有一张图像,我想旋转该图像,如下所示: 旋转必须是自动的。另一方面必须计算旋转角度。
[1 - 图片]
对于 openCV 上的这种轮换有什么想法吗?
如何在该图像上提取一个小矩形?像这样 : (我已经用红色标记了一些区域)
[2 - 图片]
有没有办法在 OpenCV 上从该图像中提取该区域?
最佳答案
我不了解 openCV,但是您添加了 C# 和 C++ 标签,这让我认为您会接受可以用这些语言实现的算法。
回答你的第一个问题:
如果您的图像与您提供的图像相似,您可以执行以下操作(这些不一定是连续的步骤,它们的编号只是为了便于引用):
转换为黑白(如果您愿意,您可以仅在概念上执行此操作,方法是将像素值与阈值进行比较,如下所示)
沿着黑色轮廓以垂直、水平和对角线单像素步长移动
在旅行时记住 N 对坐标,以便 N 低于图像直线的预期最小长度(以像素为单位)(您必须调整 N:太长会给您带来太少的数据) ,太短会给你带来太多噪音)
根据当前点的坐标和后退N点的坐标,计算
m
和q
的y = m x + q
如果abs(Δx) ≤ abs(Δy)
或m'
且q'
ofx = m' y + q'
否则,并根据您需要的分辨率制作 4 个直方图平滑一下直方图(例如,通过向每个 channel 添加一点其相邻 channel 的值)
找到
m
、m'
、q
和q'
的最大值,并且,移除q
和q'
的最大值周围后,q
和q'< 的另外 2 个(局部)最大值
;这些将是您对矩形 4 条边界线方程参数的估计,其中m ≅ -m'
(根据您想要的最终结果,您可以使用m
、m'
或,例如(m-m')/2
)找到将矩形置于所需位置的旋转或仿射变换(例如,上述两条线的交点可能必须变换到某个位置),然后应用它
第 2 点是通过在每一步中查找当前像素周围的 8 个可能的黑色像素中的第一个黑色像素(以上一步的像素结束)来完成的。例如,如果您的最后一步是在 NE(东北)方向,并且您正在围绕轮廓顺时针行驶,则您将按以下顺序探索周围环境:NW、N、NE、E、SE、S、SW(缺少 W)因为如果它是黑色的话,它就会被上一步选中)。您可以通过线扫描找到起始像素(这将使您到达E方向,或者在反向线扫描的情况下到达W方向)。
您还应该计算轮廓的长度(以步长为单位)。如果它比您期望的要短得多,您应该放弃它并再次尝试,直到找到“真实”轮廓。
关于c# - 查找图像上的区域 - 自动旋转图像 OpenCv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17632169/