警告:分辨率 0 dpi 无效.改用 70



我知道这个主题已经存在,但我没有找到任何解决方案。 我正在尝试从下面的代码中检测图片中的字符:

#include <tesseract/baseapi.h>
#include <leptonica/allheaders.h>
#include <opencv2/opencv.hpp>
#include <sstream>
#include <memory>
#include <iostream>
#define path "/home/jovan/Pictures/"
void resize(cv::Mat &img);
PIX *mat8ToPix(const cv::Mat *mat8);
cv::Mat pix8ToMat(PIX *pix8);
int main(int argc, char **argv)
{
// Load image
std::stringstream ss;
ss << path;
ss << argv[1];
cv::Mat im = cv::imread(ss.str() );
if (im.empty())
{
std::cout<<"Cannot open source image!" << std::endl;
return EXIT_FAILURE;
}
resize(im);
cv::Mat gray;
cv::cvtColor(im, gray, CV_BGR2GRAY);
// Pass it to Tesseract API
tesseract::TessBaseAPI tess;
tess.Init(NULL, "eng", tesseract::OEM_DEFAULT);
tess.SetPageSegMode(tesseract::PSM_SINGLE_BLOCK);
tess.SetVariable("tessedit_char_whitelist", "QWERTYUIOPASDFGHJKLZXCVBNM");
PIX *image = mat8ToPix(&im);
//tess.SetImage((uchar*)gray.data, gray.cols, gray.rows, 1, gray.cols);
tess.SetImage(image);
// Get the text
char* out = tess.GetUTF8Text();
if(out != nullptr)
std::cout << "here it is: "<< out << std::endl;
cv::imshow("image", im);
cv::imshow("gray", gray);
cv::waitKey();
return 0;
}
void resize(cv::Mat &img)
{
while(img.size().width >= 500 && img.size().height >= 500 )
cv::resize(img, img, cv::Size(img.size().width/2, img.size().height/2) );   
}
PIX *mat8ToPix(const cv::Mat *mat8)
{
PIX *pixd = pixCreate(mat8->size().width, mat8->size().height, 8);
for(int y=0; y<mat8->rows; y++) 
for(int x=0; x<mat8->cols; x++) 
pixSetPixel(pixd, x, y, (l_uint32) mat8->at<uchar>(y,x));
return pixd;
}
cv::Mat pix8ToMat(PIX *pix8)
{
cv::Mat mat(cv::Size(pix8->w, pix8->h), CV_8UC1);
uint32_t *line = pix8->data;
for (uint32_t y = 0; y < pix8->h; ++y) 
{
for (uint32_t x = 0; x < pix8->w; ++x) 
mat.at<uchar>(y, x) = GET_DATA_BYTE(line, x);
line += pix8->wpl;
}
return mat;
}

无论我把什么图片处理,我都会在终端上得到这个:

$:警告:分辨率 0 dpi 无效。改用 70。

有人有解决方案吗?

提前谢谢。

如果您知道输入图像的分辨率,则可以在Leptonica Pix对象上调用pixSetResolution

或者使用 Tesseract API 传入值。看 Tess4j - Pdf to Tiff to tesseract - "警告:分辨率 0 dpi 无效。改用 70。

也许它有帮助:我使用了EMGU和C#,但我认为它在C++中一定是一样的:

ocr.SetVariable("user_defined_dpi", "70");

。并且消息应该消失;)

我有类似的问题。从这里发现图像中的深色背景是问题所在。图像颜色的反转有效。

相关内容

  • 没有找到相关文章

最新更新