У меня нет опыта с tesseract самостоятельно, но репликация персонажа и добавление некоторых фоновых работ на https://www.newocr.com/
, который использует tesseract внутренне, в соответствии с результатом google.
Так что я использовал это в качестве входных данных:
, которая дает правильный результат на том, что веб-приложение: 99999999
, в то время как один символ не работает. Возможно, вы можете проверить это с помощью своей реализации tesseract, и, возможно, это поможет вам настроить изолированные выделенные символы для работы с tesseract. например попробуйте сшить несколько дубликатов выделенного контура рядом друг с другом, чтобы улучшить вывод tesseract - поскольку вы знаете, как часто вы прошивали контур рядом друг с другом, вы будете знать, что результат может быть правильным, если он распознает тот же символ, который часто бывает ..
же работаю на
граница выглядит важной, без достаточной границы будет распознано P
. В общем, афайк вы должны попытаться заменить фон и переднем плане чистым черным и чистым белым! Не уверен, какая предварительная обработка используется в веб-приложении ...
Этот код может использоваться для повторения изображения с C++ и OpenCV, но он не будет добавлять границу вокруг. Для этого вы будете работать очень похоже, но с некоторыми дополнительными шагами, и вам придется назначить некоторый цвет границе.
EDIT: Я обновил код, чтобы использовать границу по 4 пикселя в каждом направлении (вы можете отрегулировать переменную) и с черным цветом фона.
Этот код очень прост и должен быть очень похож на OpenCV в Java, Python и т.д.
int main(int argc, char * argv[])
{
//cv::Mat input = cv::imread("../inputData/ocrR.png");
if(argc != 3)
{
std::cout << "usage: .exe filename #Repetitions" << std::endl;
return 0;
}
std::string filename = argv[1];
int nRepetitions = atoi(argv[2]);
cv::Mat inputImage = cv::imread(filename);
if(inputImage.empty())
{
std::cout << "image file " << filename << " could not be loaded" << std::endl;
return 0;
}
// you instead should try to extract the background color from the image (e.g. from the image border)
cv::Scalar backgroundColor(0,0,0);
// size of the border in each direction
int border = 4;
cv::Mat repeatedImage = cv::Mat(inputImage.rows + 2*border, nRepetitions*inputImage.cols + 2*border, inputImage.type() , backgroundColor);
cv::Rect roi = cv::Rect(border,border,inputImage.cols, inputImage.rows);
for(int i=0; i<nRepetitions; ++i)
{
// copy original image to subimage of repeated image
inputImage.copyTo(repeatedImage(roi));
// update roi position
roi.x += roi.width;
}
// now here you could send your repeated image to tesseract library and test whether nRepetitions times a letter was found.
cv::imwrite("repeatedImage.png", repeatedImage);
cv::imshow("repeated image" , repeatedImage);
cv::waitKey(0);
return 0;
}
дает этот результат:
Спасибо за ввод, я попробую это. Но можете ли вы проверить это поведение с буквой «R»? –
да, обновленный ответ. Интересно, что с 7 или менее «R» будет распознаваться как n раз «p», но с 8 буквами оно будет распознано как «R» ... даже если оно порождено до чистого черного и чистого белого. в конце концов, я не знаю, какая предварительная обработка выполняется этим веб-приложением, поэтому все это просто догадки ... – Micka
Странно, что ваши изображения тоже работают для меня. : p Можете ли вы рассказать мне, как копировать это изображение один за другим? –