首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >警告:无效分辨率0 dpi。使用70代替

警告:无效分辨率0 dpi。使用70代替
EN

Stack Overflow用户
提问于 2019-10-11 14:31:59
回答 3查看 4.5K关注 0票数 0

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

代码语言:javascript
运行
复制
#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代替。

有人有什么解决办法吗?

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2019-10-11 23:37:21

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

或者使用Tesseract API传递值。请参阅Tess4j - Pdf to Tiff to tesseract - "Warning: Invalid resolution 0 dpi. Using 70 instead."

票数 3
EN

Stack Overflow用户

发布于 2020-09-22 21:10:54

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

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

..。而信息应该消失;)

票数 0
EN

Stack Overflow用户

发布于 2021-05-10 00:14:15

我也有过类似的问题。从here中发现,图像中的暗背景是问题所在。图像颜色的倒置有效。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58343459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档