Qt+opencv实现图片校正(二)

Qt图片校正(二)

简述

在上篇中,简单的叙述了,图片校正原理。此篇讲解代码部分。

PDF转图片代码

//这里用的第三方库
PDF转图片代码 下载PDF转图片代码,点击此处

图片转PDF

//图片转PDF,这里用的QT自带的库
void ImageToPdf::startImageToPdf(const QString& imgPath, const QString& pdfpath)
{
    QPrinter printer_pixmap(QPrinter::HighResolution);
    QPixmap pixmap(imgPath);
    printer_pixmap.setOutputFormat(QPrinter::PdfFormat);  //设置输出格式为pdf
    printer_pixmap.setOutputFileName(pdfpath);   //设置输出路径
    printer_pixmap.setPageSize(QPageSize(QSize(pixmap.width(), pixmap.height())));  //设置纸张大小为A4

    QPainter painter_pixmap;
    painter_pixmap.begin(&printer_pixmap);
    QRect rect = painter_pixmap.viewport();
    int mutipleW = rect.width() / pixmap.width();
    int mutipleH = rect.height() / pixmap.height();
    painter_pixmap.scale(mutipleW, mutipleH);

    painter_pixmap.drawPixmap(0, 0, pixmap);  //画图
    painter_pixmap.end();
}

opencv图片校正

using namespace std;
std::vector<std::vector<cv::Point>> contours;

void CImageRotationDll::ImageRotationStart(const std::string& inputPath, const std::string& outputPath)
{
    auto FNsearchQR = [&](cv::Mat image)
    {
        cv::Mat imageGray, imageROI, imageGuussian, imageSobelX, imageSobelY, imageSobelOut;
        //转化为灰度图  
        cvtColor(image, imageGray, CV_RGB2GRAY);
        imageROI = imageGray(cv::Range(image.rows - 80, image.rows), cv::Range(image.cols - 450, image.cols));
        //高斯平滑滤波  
        GaussianBlur(imageROI, imageGuussian, cv::Size(3, 3), 0);

        //求得水平和垂直方向灰度图像的梯度差,使用Sobel算子  
        cv::Mat imageX16S, imageY16S;
        Sobel(imageGuussian, imageX16S, CV_16S, 1, 0, 3, 1, 0, 4);
        Sobel(imageGuussian, imageY16S, CV_16S, 0, 1, 3, 1, 0, 4);
        convertScaleAbs(imageX16S, imageSobelX, 1, 0);//将中间结果转换为CV_8U
        convertScaleAbs(imageY16S, imageSobelY, 1, 0);
        imageSobelOut = imageSobelX - imageSobelY;

        //均值滤波,消除高频噪声  
        blur(imageSobelOut, imageSobelOut, cv::Size(3, 3));

        //二值化  
        cv::Mat imageSobleOutThreshold;
        threshold(imageSobelOut, imageSobleOutThreshold, 180, 255, CV_THRESH_BINARY);

        //闭运算,填充条形码间隙  
        cv::Mat  element = cv::getStructuringElement(0, cv::Size(7, 7));
        morphologyEx(imageSobleOutThreshold, imageSobleOutThreshold, cv::MORPH_CLOSE, element);

        //腐蚀,去除孤立的点  
        erode(imageSobleOutThreshold, imageSobleOutThreshold, element);

        //膨胀,填充条形码间空隙,根据核的大小,有可能需要2~3次膨胀操作  
        dilate(imageSobleOutThreshold, imageSobleOutThreshold, element);
        dilate(imageSobleOutThreshold, imageSobleOutThreshold, element);
        dilate(imageSobleOutThreshold, imageSobleOutThreshold, element);

        //通过findContours找到条形码区域的矩形边界
        vector<cv::Vec4i> hiera;
        findContours(imageSobleOutThreshold, contours, hiera, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
    };

    cv::Mat image;
    cv::Mat imagetrans;
    image = cv::imread(inputPath);
    //搜索条形码
    FNsearchQR(image);
    int index = 0;
    //判断是否检测到条形码,如果不是,则顺按时针旋转90度
    while (contours.size() != 1)
    {
        index++;
        transpose(image, imagetrans);
        flip(imagetrans, image, 1);
        if (index == 3)
        {
            break;
        }
        FNsearchQR(image);
    }
    //保存
    cv::imwrite(outputPath, image);
    cv::waitKey();
}

总结

我图片校正思路,就上面的,PDF转图片,然后利用opencv处理图片,最后,图片转PDF。最后就是我想要的结果了,如果有大神有更好的思路和算法,不忘提点下。在此谢谢了。
~~~~~~~~~~~~~~~仅供学习参考使用~~~~~~~~~~~~~~~

Qt图片校正(一)

猜你喜欢

转载自blog.csdn.net/ly305750665/article/details/80350338