1

我的目标是开发一个 iOS 应用程序,它可以捕获图像 > 提取以特定颜色(蓝色)表示的盲文点 > 使用图像处理技术将盲文字母转换为文本。

我的方法是使用 OpenCV/C++ 对图像进行处理,以将这张照片中显示的蓝色圆点提取到这张照片中

下一步是识别图像中的盲文并将其翻译成文本,一种解决方案是在图像上放置一个网格以找到交点像素颜色值,然后将它们分类为(如果是白色,则为 0,如果是黑色),如图所示这张照片

建议的解决方案的问题是:

  1. 如何将网格行/列定位在想要的位置?
  2. 如何获取交点的坐标和值(0或1)?

如果您对提议的解决方案或任何其他解决方案有任何建议/解决方案,请分享它们。由于我在 OpenCV/C++ 领域没有经验,我们将不胜感激。

*请注意,python 解决方案不能在 iOS 中使用(据我所知)。

我附上了我的代码以供参考

 + (UIImage *)detectRedShapesInImage:(UIImage *)image{
cv::Mat mat;
UIImageToMat(image, mat);
cv::medianBlur(mat, mat, 3);

// Convert input image to HSV
cv::Mat hsv_image;
cv::cvtColor(mat, hsv_image, cv::COLOR_BGR2HSV);

// Threshold the HSV image, keep only the red (replaced it with blue) pixels
cv::Mat lower_red_hue_range;
cv::Mat upper_red_hue_range;
cv::inRange(hsv_image, cv::Scalar(0, 100, 100), cv::Scalar(10, 255, 255), lower_red_hue_range);
cv::inRange(hsv_image, cv::Scalar(160, 100, 100), cv::Scalar(179, 255, 255), upper_red_hue_range);

// Combine the above two images
cv::Mat red_hue_image;
cv::addWeighted(lower_red_hue_range, 1.0, upper_red_hue_range, 1.0, 0.0, red_hue_image);
cv::GaussianBlur(red_hue_image, red_hue_image, cv::Size(9, 9), 2, 2);


// detect circules, for now it doesnot take all circles
std::vector<cv::Vec4f> circles;
cv::HoughCircles(red_hue_image, circles, cv::HOUGH_GRADIENT, 1.0, 20,  150, 40, 0, 0);

// Loop over all detected circles and outline them on the original image
if(circles.size() == 0) std::exit(-1);
for(size_t current_circle = 0; current_circle < circles.size(); ++current_circle) {
    cv::Point center(std::round(circles[current_circle][0]), std::round(circles[current_circle][1]));
    int radius = std::round(circles[current_circle][2]);
    
    cv::circle(red_hue_image, center, radius, cv::Scalar(0, 255, 0), 5);
    
}


UIImage *maskedShapesImg = MatToUIImage(red_hue_image);

return maskedShapesImg;}
4

1 回答 1

1

提示:

假设文本是相当水平的并且行间距足够:

  • 得到点的中心;
  • 找到点之间的最短水平和垂直距离;这些为您提供水平和垂直间距;
  • 将不超过一个水平间距或两个垂直间距的点聚集在一起(有安全裕度);一个簇应该对应一个字符;
  • 找到字符的左上角;
  • 找到字符之间的中值水平和垂直距离;
  • 根据这些信息(点和字符间距),通过预测网格节点并使用最近邻规则将点映射到网格。

由于并非所有字符都占据两列和三行点,因此这项工作有点棘手。

于 2022-02-05T17:42:59.160 回答