4

我遇到了一个问题,即如何识别图像中的某些模式。

图像是纯白色的纸图像,四个角的图案是黑色的。我想识别图像上的黑色图案?

我在网上冲浪了很多,发现opencv作为答案。但是没有提供任何内容来描述如何使用 opencv 来实现所需的功能。

请帮助我提供一些编码观点或提供一些我应该遵循的链接或任何我应该用来实现此功能的开源库的名称。图案的图像如下: - 在此处输入图像描述

图像由纯白色背景和角落中的四个黑色图案组成。我需要识别所有四个角落中的这些黑色图案,然后对图像进行处理。以椭圆形显示的一个角落以突出显示它。

任何建议将不胜感激。

提前致谢!

4

2 回答 2

3

我真的不明白你的问题 - 如果你说:

图像是纯白色的纸图像,四个角的图案是黑色的。

那么从图像中只屏蔽这四个轮廓有什么问题呢?在用 4 个长度为 40 像素的正方形做蒙版后,我得到了这个:

在此处输入图像描述

要删除小区域,您可以使用形态学操作。我懂了:

在此处输入图像描述

只需在输入图像上绘制它们(可选)。结果如下:

在此处输入图像描述

为了实现这个算法,我使用 OpenCV 库。我 100% 确定它适用于 IOS - OpenCV 团队终于发布了 IOS 版本。所以如果你说:

我尝试运行 OpenCV-iOS 链接,但项目没有运行,它显示错误。

那么我们无法帮助你,因为我们不是心灵感应者,无法看到你的问题。只是一个小建议——试着用谷歌搜索你的问题。我有 99% 的把握它应该会有所帮助。

以免我忘记 - 这是 C++ 代码:

Mat src = imread("input.png"), tmp;

//convert image to 1bit
cvtColor(src, tmp, CV_BGR2GRAY);
threshold(tmp, tmp, 200, 255, THRESH_OTSU);

//do masking
#define DELTA 40
for (size_t i=0; i<tmp.rows; i++)
{
    for (size_t j=0; j<tmp.cols; j++)
    {
        if(!((i < DELTA && j < DELTA)
         || (i < DELTA && j > tmp.cols - DELTA)
         || (i > tmp.rows - DELTA && j < DELTA)
         || (i > tmp.rows - DELTA && j > tmp.cols - DELTA)))
        {
            //set color to black
            tmp.at<uchar>(i, j) = 255;
        }
    }
}

bitwise_not(tmp,tmp);

//erosion and dilatation:
Mat element = getStructuringElement(MORPH_RECT, Size(2, 2), Point(1, 1));

erode(tmp, tmp, element);
dilate(tmp, tmp, element);

//(Optional) find contours and draw them:
vector<Vec4i> hierarchy;
vector<vector<Point2i> > contours;

findContours(tmp, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);

for (size_t i=0; i<contours.size(); i++)
{
    drawContours(src, contours, i, Scalar(0, 0, 255), 1);
}
于 2012-08-14T19:30:22.130 回答
1

也许这个问题对您有帮助,尤其是网球识别教程的链接似乎正是您正在寻找的。

关于如何在 iOS 上使用 OpenCV,您可能想看看OpenCV-iOSComputer Vision with iOS

于 2012-08-11T11:11:41.990 回答