python - 使用 python 和 opencv 检测图像中的部分圆圈

标签 python opencv

<分区>

我今天拍了大约 220 张日偏食的照片,并计划制作该事件的延时动画。正如预期的那样,日偏食的图像会跳来跳去,我需要在制作动画之前对镜头进行配准。

以下是示例照片:

http://www.trivalleystargazers.org/gert/sofi_141023/sofi.htm

我想将图像集中在太阳上,这在 eclipse 期间显然是圆的一部分。我猜月亮会分散算法的注意力(我不想以月亮为中心)。我对 Python 有一些了解,但对 opencv 没有任何了解。

有没有一种简单的方法可以在图像中找到太阳并将其居中到大约。 1像素精度? opencv + python 是正确的方法吗?是否有特定的技巧可以达到最佳效果?

谢谢 & 晴朗的天空, 格特

最佳答案

你可以试试这个:

  • 阈值图像
  • 得到最大的轮廓
  • 找到包围该轮廓的最小面积圆

找到中心和半径后,注册起来会更容易。如果快照之间的半径不同,您必须将所有圆圈的大小调整为预定义的大小,并在配准阶段相应地调整中心。

我在 OpenCV 和 C++ 中试过了。

    Mat im = imread(INPUT_FOLDER_PATH + string("SoFi_400_20141023_163450.jpg"));

    Mat gray;
    cvtColor(im, gray, CV_BGR2GRAY);

    Mat bw;
    threshold(gray, bw, 0, 255, CV_THRESH_BINARY|CV_THRESH_OTSU);

    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;
    findContours(bw, contours, hierarchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
    /* in actual implementation you'll have to find the largest contour. 
    here i'm just assuming i get one and it's the largest*/
    for(int idx = 0; idx >= 0; idx = hierarchy[idx][0])
    {
        Point2f center;
        float radius;
        minEnclosingCircle(contours[idx], center, radius);
        cout << idx << " (" << center.x << ", " << center.y << ") : " << radius << endl;

        circle(im, Point(center.x, center.y), radius, Scalar(0, 255, 255), 2);
    }

    imshow("", im);
    waitKey();

一些结果:

enter image description here enter image description here

关于python - 使用 python 和 opencv 检测图像中的部分圆圈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26543439/

相关文章:

python - kaggle 脚本编辑器中来自 OpenCV 的 SIFT

linux - 在centos 6.3中安装OPENCV 2.4.4

python - 使用 Flask-Login 注销特定用户

python - Django - 在一页中列出许多不同的模型

python - 在plotly中创建后如何更改子图标题?

linux - 文件 INSTALL 无法在 libippicv 上设置权限

python - 终端关闭时终止sudo python脚本

python - 多次匹配任何字符,但在给定字符处停止

javascript - 彩色滤光片技术 OpenCV

c++ - 为什么SADWinowSize_slider 的trackbar 的值在分配给sbm->state.SADWindowSize 时变为0,在我的代码中