我正在开发一个程序,该程序使用 OpenCV 从一帧中提取给定文本的区域。拿到之后,应该是那个区域的模糊处理。给定框内显示的文本,文本始终处于水平状态,颜色为白色。但我不知道文本在框架中的显示位置。偶尔会更改文本的位置。
- 如何使用 OpenCV 提取文本的区域(x、y、宽度、高度)?
- 有什么工具可以做到这一点吗?
我附上了两个样本框架。可以在游戏标记下看到 8 位十六进制代码。
请指教,谢谢。
我正在开发一个程序,该程序使用 OpenCV 从一帧中提取给定文本的区域。拿到之后,应该是那个区域的模糊处理。给定框内显示的文本,文本始终处于水平状态,颜色为白色。但我不知道文本在框架中的显示位置。偶尔会更改文本的位置。
我附上了两个样本框架。可以在游戏标记下看到 8 位十六进制代码。
请指教,谢谢。
网络上有几个资源。一种方法是通过查找靠近的边缘元素(链接)来检测文本。总结一下,您首先使用或任何其他边缘检测方法检测图像中的cv::Canny
边缘cv::Sobel
(尝试哪种方法最适合您的情况)。然后用阈值对图像进行二值化。
要删除工件,您可以应用等级过滤器。然后你将你的字母与形态学操作合并cv::morphologyEx
。您可以尝试扩张或关闭。关闭将关闭字母之间的空间并将它们合并在一起而不会改变太多大小。您必须使用内核大小和形状。知道您使用 检测轮廓cv::findContours
,进行多边形逼近并计算轮廓的边界矩形。
要检测正确的轮廓,您应该测试正确的大小左右(例如if (contours[i].size()>100)
)。然后,您可以根据本文详细说明的内容对找到的字段进行排序。
这是第一篇文章的代码:
#include "opencv2/opencv.hpp"
std::vector<cv::Rect> detectLetters(cv::Mat img)
{
std::vector<cv::Rect> boundRect;
cv::Mat img_gray, img_sobel, img_threshold, element;
cvtColor(img, img_gray, CV_BGR2GRAY);
cv::Sobel(img_gray, img_sobel, CV_8U, 1, 0, 3, 1, 0, cv::BORDER_DEFAULT);
cv::threshold(img_sobel, img_threshold, 0, 255, CV_THRESH_OTSU+CV_THRESH_BINARY);
element = getStructuringElement(cv::MORPH_RECT, cv::Size(17, 3) );
cv::morphologyEx(img_threshold, img_threshold, CV_MOP_CLOSE, element); //Does the trick
std::vector< std::vector< cv::Point> > contours;
cv::findContours(img_threshold, contours, 0, 1);
std::vector<std::vector<cv::Point> > contours_poly( contours.size() );
for( int i = 0; i < contours.size(); i++ )
if (contours[i].size()>100)
{
cv::approxPolyDP( cv::Mat(contours[i]), contours_poly[i], 3, true );
cv::Rect appRect( boundingRect( cv::Mat(contours_poly[i]) ));
if (appRect.width>appRect.height)
boundRect.push_back(appRect);
}
return boundRect;
}