C# 线路端点检测

C# 线路端点检测,c#,line,ocr,detection,endpoint,C#,Line,Ocr,Detection,Endpoint,我计划检测由C#中的字符(OCR)生成的行的端点。我想要这样的东西: 我所说的“端点”是指我想要得到字符中任何行的端点。。。例如,“C”有两个端点(一个在顶部,一个在底部),如上图所示,表示为红色像素。我可以从“更胖”的现有扫描字符中提取单行线,我可以进行边缘检测和泛光填充分析,但我似乎无法复制上述内容!任何指向文章或现有代码的指针都将不胜感激!任何代码示例都很好,因为我可以很容易地将C++或任何.NET语言转换成C。 谢谢,Josh因为你还没有“端点”的定义,我建议: 黑点是所有邻居的端点

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

我所说的“端点”是指我想要得到字符中任何行的端点。。。例如,“C”有两个端点(一个在顶部,一个在底部),如上图所示,表示为红色像素。我可以从“更胖”的现有扫描字符中提取单行线,我可以进行边缘检测和泛光填充分析,但我似乎无法复制上述内容!任何指向文章或现有代码的指针都将不胜感激!任何代码示例都很好,因为我可以很容易地将C++或任何.NET语言转换成C。
谢谢,Josh因为你还没有“端点”的定义,我建议:

  • 黑点是所有邻居的端点iif(即曼哈顿距离的黑点),我就是这样做的。 对于每个不为0的像素,计算该像素周围3 x 3网格中不为0的像素数。如果该数字为2,则有一条线的端点

    // 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;
    }
    
    //计算像素附近的点数
    内联整数邻域(cv::Mat&img、整数xc、整数yc)
    {
    if(img.empty())返回0;
    if(img.type()!=CV_8UC1)返回0;
    xc++;
    yc++;
    int-iCnt=0;
    对于(int y=yc-2;y=img.rows))继续;
    uint8_t*buf=img.ptr(y);
    对于(intx=xc-2;x0)和(x
    如果您愿意,可以使用内核来完成countneighborary。 函数getEndPoints返回找到的所有端点的数组


    另外,此函数适用于黑色(0)背景和白色(1-255)als行。

    好,我将用定义更新问题。基本上我想得到的是任何线的末端。。。例如,“C”有两个端点(一个在顶部,一个在底部),如上图所示,表示为红色像素。我还想过扫描整行(因为我已经有了黑色的像素,因为我使用了泛光填充算法从PNG中选择字符,然后使用行细化算法将其细化为一行)并搜索一个仅由一个其他黑色像素包围的黑色像素(包括对角线在内的所有方向)。@jduncanator:这个定义在任何地方都不够专业,无法实际使用。另外,一个端点可能很容易有两个黑色邻居,都在同一侧。