OPENCV :: 找到两个同心圆之间的所有点
Posted
技术标签:
【中文标题】OPENCV :: 找到两个同心圆之间的所有点【英文标题】:OPENCV :: Find all the points between two concentric circles 【发布时间】:2018-07-12 12:17:45 【问题描述】:我有两个同心圆 a 和 b,我从图像中检测到圆,我知道它们的半径。我想要的是两个同心圆之间的点,这样我就可以从这些点中提取 RGB 值。任何帮助都会有所帮助。
【问题讨论】:
我知道,我可以使用这个 x_perimeter = (int) x + (int) ((sin(i) * radius )) 和类似的 Y 在圆上找到点。但我想要所有的点在两个圆的圆周之间。 嘿基肖尔!你能告诉我们为什么到目前为止你已经尝试过代码明智的做法吗?感谢您使用 ***,希望您能找到答案 【参考方案1】:两个同心圆(中心(x_0, y_0
),半径r_0, r_1
和r_1 > r_0
)之间的点的索引(x, y
)必须满足以下条件:
(x-x_0) * (x-x_0) + (y-y_0) * (y-y_0) >= r_0 * r_0
(x-x_0) * (x-x_0) + (y-y_0) * (y-y_0) <= r_1 * r_1
因此,当遍历图像的所有点时,您可以确定要处理哪些点:
for (int x=0; x<img.rows; x++)
for (int y=0; y<img.cols; y++)
double dd = (x-x_0) * (x-x_0) + (y-y_0) * (y-y_0);
if (dd < r_0 * r_0 || dd > r_1 * r_1)
continue;
// Do what you have to do with the points between the two circles
【讨论】:
感谢您的回答。但我有处理时间的问题。有没有更快的方法来做到这一点。因为我将从相机连续传输帧。我相信循环遍历整个图像会消耗更多时间? 您应该只对我们最大圆的中心和半径定义的区域感兴趣。因此,您只循环通过for(int x = x_0 - r_1; x < x_0 + r_1; x++)
和类似的y
。在这种情况下,您还应该检查您是否没有迭代图像的边界
谢谢!我会试试这个。【参考方案2】:
伪代码:
制作与源图像大小相同的 Mat。 使用内置的 OpenCV 圆绘制例程绘制两个实心圆。 (白色大圆圈,黑色小圆圈) 使用它作为掩码,在源图像上相乘。 (根据您希望保留的像素,可能需要反转蒙版。)【讨论】:
【参考方案3】:如果您需要访问所有像素并以某种方式收集它们的颜色值,并且您只想访问有问题的像素,因为速度至关重要,我建议您查看midpoint circle algorithm authored by Bresenham。您可以对此进行专门化,以便每条像素线仅获得 2 或 4 个点,并遍历每条线的点对。应该是可能的 O(n),其中 n 是以像素为单位的高度(直径,即最大半径),所以你会看 o(m),m 是两个像素之间的像素数,而不是 n^2。如果您的大图像和半径彼此靠近,这将很重要。
【讨论】:
以上是关于OPENCV :: 找到两个同心圆之间的所有点的主要内容,如果未能解决你的问题,请参考以下文章
计算机视觉OpenCV 4高级编程与项目实战(Python版):使用NumPy创建黑白同心圆图像
计算机视觉OpenCV 4高级编程与项目实战(Python版):使用NumPy创建黑白同心圆图像