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_1r_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 &lt; 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创建黑白同心圆图像

OpenCV-绘制奥运五环(带套接效果)

核心图形绘制同心圆并填补它们之间的空白

在PS中,画两个同心圆,一个大,一个小,怎样把它们过渡成从大到小或从小到大的动画

己知点坐标和半径R,求每隔45度半径与同心圆交汇的坐标