OpenCV / Python-从灰度图像中找到灰度图案矩形的角坐标?

时间:2018-06-20 21:49:45

标签: python opencv

我想从带有一些噪点的灰度图像中获取矩形对象的角坐标。

我从这张图片https://imgur.com/BNoCn1u开始。中心区域具有灰色强度不同的方格矩形。我想要的是绿色https://imgur.com/97efZlb中矩形的坐标。

使用以下代码:

im = cv2.imread("opencv_frame_0.tif",0)
data = np.array(im)
edg = cv2.Canny(data, 120, 255)
ret,thresh = cv2.threshold(data,140,255,1)
imshow(thresh,interpolation='none', cmap=cm.gray)

我能够得到https://imgur.com/1xurVTB。看起来不错,但是我不知道如何有效地获取拐角坐标的中心白框。稍后我将有其他类似的图像,其中中心的灰色矩形可以具有不同的大小,因此我希望对代码进行优化以适合将来。

我尝试了OpenCV - How to find rectangle contour of a rectangle with round corner?OpenCV/Python: cv2.minAreaRect won't return a rotated rectangle中的其他示例。最后一个给我https://imgur.com/E4Gl8Z6最佳设置。

感谢您的帮助!谢谢。

2 个答案:

答案 0 :(得分:1)

如果您正在寻找实现更多功能的python代码,可以在此仓库中找到它。

https://github.com/DevashishPrasad/Angle-Distance

因此,要解决您的问题,此代码可能会有所帮助-

>>> play
      No      Yes
0     2        0
1     3        1
2     5        4  

评论全部解释

输出-4 corners and their coordinates

答案 1 :(得分:0)

从预处理中,我得到以下输出: enter image description here 从这里您可以轻松找到自己喜欢的4个角(使用HarrisCorners等功能,对图像进行矢量化并采用几何方法,您自己的角检测算法等)。这真的取决于您自己的需求。

这是我的代码,我要做的是:  1.模糊  2.门槛  3.查找连接的组件  4.找到最大的并分离  5.找到轮廓

根据需要进行修改,仅作为参考(以防万一,OpenCV在C ++和Python中是相同的,并且您提供的示例表明您知道自己在做什么) :

#include <opencv2/opencv.hpp>
#include <algorithm>
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
    Mat img2, img = imread("pic.png");
    cvtColor(img, img, cv::COLOR_BGR2GRAY);
    blur(img, img, Size(7, 7));

    threshold(img, img2, 0, 255, THRESH_OTSU | THRESH_BINARY_INV);

    Mat labels, stats, centroids;
    int n = cv::connectedComponentsWithStats(img2, labels, stats, centroids, 8, CV_16U);
    ushort area, x0, y0, labelBig = 0, maxArea = 0;
    for (int i = 1 ; i < n ; i++) {
        area = stats.at<int>(i, cv::CC_STAT_AREA);
        if (area > maxArea) {
            maxArea = area;
            labelBig = i;
        }
    }

    Mat img3 = Mat(img2.rows, img2.cols, CV_8U, Scalar(0));

    std::mutex mtx;
    labels.forEach<ushort>([&img3, labelBig, &mtx](ushort &label, const int pos[]) -> void {
        if (label == labelBig) {
            lock_guard<mutex> guard(mtx);
            img3.at<uchar>(pos) = 255;
        }
    });
    Mat img4;
    Canny(img3, img4, 50, 100, 3);
    imshow("Frame", img4);
    waitKey();
    return 0;
}

请注意,我正在使用Otsu阈值处理,这使其具有一定的鲁棒性。还请注意,我也在反转您的图像;之后,最大和最白的区域就是我认为的矩形。