我的目标是开发一个 iOS 应用程序,它可以捕获图像 > 提取以特定颜色(蓝色)表示的盲文点 > 使用图像处理技术将盲文字母转换为文本。
我的方法是使用 OpenCV/C++ 对图像进行处理,以将这张照片中显示的蓝色圆点提取到这张照片中
下一步是识别图像中的盲文并将其翻译成文本,一种解决方案是在图像上放置一个网格以找到交点像素颜色值,然后将它们分类为(如果是白色,则为 0,如果是黑色),如图所示这张照片
建议的解决方案的问题是:
- 如何将网格行/列定位在想要的位置?
- 如何获取交点的坐标和值(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;}