首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线端点检测

线端点检测
EN

Stack Overflow用户
提问于 2012-04-18 06:16:06
回答 2查看 750关注 0票数 6

我计划在C#中检测由字符(OCR)生成的线条的端点。我想要这样的东西:

我所说的“端点”是指我想要得到字符中任何行的末尾...例如,“C”有两个端点(一个在顶部,一个在底部),如上图所示,表示为红色像素。我可以从“胖”的现有扫描字符中提取单行,我可以做边缘检测和Flood-fill分析,但我似乎不能复制上面的内容!任何指向文章或现有代码的指针都将不胜感激!任何代码示例都可以,因为我可以很容易地将C++或任何.NET语言转换为C#。

谢谢你,乔希

EN

回答 2

Stack Overflow用户

发布于 2012-04-18 08:01:30

由于您还没有“端点”的定义,因此我建议:

  • 如果所有邻居(即曼哈顿距离<=为3的黑点)都位于小于45度的扇区内,则黑点是一个端点。

找到每个相邻黑点的角度应该不是太难。对这些角度进行排序并找到范围也不困难,尽管您需要小心不连续(角度突然变化360度)。按坡度排序而不实际计算角度可能会稍微快一些。使用提前退出逻辑可以获得额外的加速比。

票数 1
EN

Stack Overflow用户

发布于 2018-05-16 20:28:59

我就是这么做的。对于每个不为0的像素,计算该像素周围3x3网格中不为0的像素数量。如果数字是2,则表示有一条线的端点。

代码语言:javascript
复制
// count the number of points in the neighborhood of our pixel
inline int countNeighborhood(cv::Mat &img, int xc, int yc)
{
    if (img.empty()) return 0;
    if (img.type() != CV_8UC1) return 0;
    xc++;
    yc++;
    int iCnt = 0;
    for (int y = yc - 2; y <= yc; y++)
    {
        if ((y < 0) || (y >= img.rows)) continue;
        uint8_t *buf = img.ptr(y);
        for (int x = xc - 2; x <= xc; x++)
            if ((x > 0) && (x < img.cols) && (buf[x])) iCnt++;
    }
    return iCnt;
}

/*  get endpoints of a image with lines in it
*/
std::vector<cv::Point> getEndPoints(cv::Mat &img)
{
    std::vector<cv::Point> res;
    for (int y = 0; y < img.rows; y++)
    {
        uint8_t *buf = img.ptr(y);
        for (int x = 0; x < img.cols; x++)
        {
            if (buf[x] == 0) continue;
            int iCnt = countNeighborhood(img, x, y);
            if (iCnt == 2) res.push_back(cv::Point(x, y));
        }
    }
    return res;
}

如果您愿意,可以使用内核来完成countNeighborhood。函数getEndPoints返回所有找到的端点的数组。

附注:此函数适用于黑色(0)背景和白色(1-255) als线条。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10199998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档