C# 线路端点检测
我计划检测由C#中的字符(OCR)生成的行的端点。我想要这样的东西: 我所说的“端点”是指我想要得到字符中任何行的端点。。。例如,“C”有两个端点(一个在顶部,一个在底部),如上图所示,表示为红色像素。我可以从“更胖”的现有扫描字符中提取单行线,我可以进行边缘检测和泛光填充分析,但我似乎无法复制上述内容!任何指向文章或现有代码的指针都将不胜感激!任何代码示例都很好,因为我可以很容易地将C++或任何.NET语言转换成C。C# 线路端点检测,c#,line,ocr,detection,endpoint,C#,Line,Ocr,Detection,Endpoint,我计划检测由C#中的字符(OCR)生成的行的端点。我想要这样的东西: 我所说的“端点”是指我想要得到字符中任何行的端点。。。例如,“C”有两个端点(一个在顶部,一个在底部),如上图所示,表示为红色像素。我可以从“更胖”的现有扫描字符中提取单行线,我可以进行边缘检测和泛光填充分析,但我似乎无法复制上述内容!任何指向文章或现有代码的指针都将不胜感激!任何代码示例都很好,因为我可以很容易地将C++或任何.NET语言转换成C。 谢谢,Josh因为你还没有“端点”的定义,我建议: 黑点是所有邻居的端点
谢谢,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; }
如果您愿意,可以使用内核来完成countneighborary。 函数getEndPoints返回找到的所有端点的数组//计算像素附近的点数 内联整数邻域(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
另外,此函数适用于黑色(0)背景和白色(1-255)als行。好,我将用定义更新问题。基本上我想得到的是任何线的末端。。。例如,“C”有两个端点(一个在顶部,一个在底部),如上图所示,表示为红色像素。我还想过扫描整行(因为我已经有了黑色的像素,因为我使用了泛光填充算法从PNG中选择字符,然后使用行细化算法将其细化为一行)并搜索一个仅由一个其他黑色像素包围的黑色像素(包括对角线在内的所有方向)。@jduncanator:这个定义在任何地方都不够专业,无法实际使用。另外,一个端点可能很容易有两个黑色邻居,都在同一侧。