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。最后就是我想要的结果了,如果有大神有更好的思路和算法,不忘提点下。在此谢谢了。
~~~~~~~~~~~~~~~仅供学习参考使用~~~~~~~~~~~~~~~