我有一组平假名字符,我想计算角色的终点/提示数。
例如: 输入图像:
所需的输出图像:
我尝试过使用凸包
代码:(基于opencv教程here)
findContours(threshold_output, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
vector<vector<Point> >hull(contours.size());
for (int i = 0; i < contours.size(); i++)
{
convexHull(Mat(contours[i]), hull[i], false);
}
Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);
for (int i = 0; i< contours.size(); i++)
{
if (hierarchy[i][3] == 0) {
Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
drawContours(drawing, hull, i, color, 1, 8, vector<Vec4i>(), 0, Point());
}
}
然后conrnerHarris()但它返回了太多不受欢迎的角落
代码:(基于opencv教程here)
int blockSize = 2;
int apertureSize = 3;
/// Detecting corners
drawing = binarizeImage(drawing); // otsu's
cornerHarris(drawing, dst, blockSize, apertureSize, 0.04, BORDER_DEFAULT);
/// Normalizing
normalize(dst, dst_norm, 0, 255, NORM_MINMAX, CV_32FC1, Mat());
convertScaleAbs(dst_norm, dst_norm_scaled);
int countCorner = 0;
/// Drawing a circle around corners
for (int j = 0; j < dst_norm.rows; j++)
{
for (int i = 0; i < dst_norm.cols; i++)
{
if ((int)dst_norm.at<float>(j, i) > 50)
{
circle(output, Point(i, j), 2, Scalar::all(255), -1, 8, 0);
countCorner++;
}
}
}
检测到11个角落。
我认为这可能与指尖检测相同,但我不知道该怎么做。
[我正在使用OpenCV 2.4.9。]
答案 0 :(得分:4)
我不倾向于使用OpenCV,因为我可以通过ImageMagick
得到我需要的东西,这是免费的,并且安装在大多数Linux发行版上,也可用于OSX和Windows。所以,我尝试使用ImageMagick,也许你可以调整我的方法 - 这只是在命令行完成。
# Thin input image down to a skeleton
convert char.jpg -threshold 50% -negate -morphology Thinning:-1 Skeleton skeleton.jpg
# Find line-ends, using Hit-or-Miss morphology, and make them green (lime). Save as "lineends.jpg"
convert skeleton.jpg -morphology HMT LineEnds -threshold 50% -fill lime -opaque white lineends.jpg
# Find line-junctions, using Hit-or-Miss morphology, and make them red. Save as "line junctions.jpg"
convert skeleton.jpg -morphology HMT LineJunctions -threshold 50% -fill red -opaque white linejunctions.jpg
# Superpose the line-ends and line junctions into a result
convert lineends.jpg linejunctions.jpg -compose lighten -composite result.jpg
现在你的线端附近会有一个红色和两个绿点,并且在交叉点附近只有红点,但没有匹配的绿点。因此,您将计算附近有绿点的红点。
我只是显示叠加了点的骨架,所以你可以看到它们之间的关系:
composite -blend 30% skeleton.jpg result.jpg z.jpg