#include "visualdetectwidget.h" #include "ui_visualdetectwidget.h" VisualDetectWidget::VisualDetectWidget(QWidget *parent) : QWidget(parent), ui(new Ui::VisualDetectWidget) { ui->setupUi(this); setWindowFlags (Qt::Window | Qt::FramelessWindowHint); setWindowModality(Qt::ApplicationModal); initialize(); initControl(); m_imgPath = ""; m_globalFlag = 0; //定义全局变量标志位; grayScale(); //灰度化与二值化; //on_buttonLoadImage_clicked();//加载图片; } VisualDetectWidget::~VisualDetectWidget() { delete ui; } void VisualDetectWidget::initialize() { } void VisualDetectWidget::initControl() { //根据不同分辨率设置控件的位置和尺寸 switch (g_emResolut) { case resolution1910: initResolution1910(); break; case resolution1006: this->resize(1024,600); break; default: initResolution1910(); break; } initControlStyle();//初始化窗体控件样式 } void VisualDetectWidget::initResolution1910() { this->resize(600,680); this->move((1920-this->width())/2,(1080-this->height())/2); ui->labelImage->setGeometry(20,20,560,560); ui->framePageBtn->setGeometry(422,610,168,70); ui->buttonBack->setGeometry(0,0,168,70); } void VisualDetectWidget::initControlStyle() { SetControlStyle setControlStyle; setControlStyle.setUiName(this->objectName()); ui->buttonBack->setBottomImage(setControlStyle.getSharedBottomStyleSheet(ui->buttonBack->parent()->objectName())); ui->buttonBack->setTopImage(setControlStyle.getSharedTopStyleSheet(ui->buttonBack->objectName())); } #if(0) void VisualDetectWidget::loadVisualDetectImage() { QDir apppath(qApp->applicationDirPath()); QString ImagePath = apppath.path() + apppath.separator() + "Image.png"; QImage image; image.load(ImagePath); QPixmap pix = QPixmap::fromImage(image); ui->labelImage->setPixmap(pix); #ifdef Q_OS_WIN int x = image.width(); int y = image.height(); std::vector v1(x,1); std::vector> v2(y,v1); for(int i = 0; i < y; i++) { for(int j = 0; j < x; j++) { QRgb pixel = image.pixel(j,i); v2[i][j] = pixel; } } #endif } #endif //将彩色图片转换为黑白图片; void VisualDetectWidget::grayScale() { QDir apppath(qApp->applicationDirPath()); QString path = apppath.path() + apppath.separator() + "Photograph" + apppath.separator() + "image.jpg"; QFile imgFile(path); if(!imgFile.exists())//不存在照片 { return; } QImage *img = new QImage(); img->load(path); unsigned int * data = (unsigned int *)img->bits(); int size = img->width()*img->height(); int red; int green; int blue; for(int i = 0; i < size; i++) { red = qRed(data[i]) * 0.3; green = qGreen(data[i]) * 0.59; blue = qBlue(data[i]) * 0.11; int rgb = red + green + blue; if(rgb > 80) { rgb = 255; } else { rgb =0; } data[i] = qRgba(rgb,rgb,rgb,qAlpha(data[i])); } QString pathSave = apppath.path() + apppath.separator() + "images_save.png"; m_imgPath = pathSave; img->save(pathSave);//保存二值化后的图片; QImage *image = new QImage(); image->load(pathSave); int width = image->width(); int height = image->height(); int labelWidth = ui->labelImage->width(); int labelHeight = ui->labelImage->height(); int imgWidth = 0; int imgHeight = 0; float labelScale = (labelWidth *1.0)/(labelHeight*1.0); float pictureScale = (width *1.0)/(height *1.0); qDebug()< pictureScale) { imgHeight = labelHeight; imgWidth = labelHeight * pictureScale; } else { imgWidth = labelWidth; imgHeight = labelWidth / pictureScale; } QPixmap *pixmap = new QPixmap; QPixmap pix = pixmap->fromImage(*image); pix= pix.scaled(imgWidth,imgHeight); ui->labelImage->setPixmap(pix); m_globalFlag =1;//灰度化转换完成 } void VisualDetectWidget::on_buttonBack_clicked() { this->close(); } //加载图片功能; void VisualDetectWidget::on_buttonLoadImage_clicked() { QString path = QFileDialog::getOpenFileName(this,tr("Select file"),"D:",tr("PNG(*.png)")); m_imgPath = path; QImage *image = new QImage(); image->load(path); int width = image->width(); int height = image->height(); int labelWidth = ui->labelImage->width(); int labelHeight = ui->labelImage->height(); int imgWidth = 0; int imgHeight = 0; float labelScale = (labelWidth * 1.0) / (labelHeight * 1.0); float pictureScale = (width * 1.0) / (height * 1.0); if(labelScale > pictureScale) { imgHeight = labelHeight; imgWidth = labelHeight * pictureScale; } else { imgWidth = labelWidth; imgHeight = labelWidth / pictureScale; } QPixmap *pixmap= new QPixmap; QPixmap pp= pixmap->fromImage(*image); pp = pp.scaled(imgWidth,imgHeight); ui->labelImage->setPixmap(pp); m_globalFlag =1; } //识别点的个数; void VisualDetectWidget::on_buttonGetPointNumber_clicked() { //获取给定的最大与最小的个数; QString str = ui->lineEdit_maxNumber->text(); int maxCount = str.toInt(); QString str2 = ui->lineEdit_minNumber->text(); int minCount = str2.toInt(); QString outStr; //对话框; QMessageBox *box = new QMessageBox(); //1.判断用户是否已经加载了图片; if(m_globalFlag == 0) { outStr = "请先加载图片"; box->information(this,"错误",outStr); } else { //判断用户是否填写输入框; //1)将字符串转化为列表; QStringList list1 = str.split(""); QStringList list2 = str2.split(""); //2)判断列表是否为空; if(list1.size() == 2 || list2.size() == 2) { //弹出对话框,提示“请输入最大与最小值” outStr = "输入框为空,请输入最大与最小值"; box->information(this,"错误",outStr); } else { //循环遍历列表,判断数值是否在0~9之间,如不在,弹出提示框;若在,则进行判断点的识别; //循环判断第一个输入框的列表; for(int i = 1; i < list1.size() - 1; i++) { QString tmp = list1.at(i); qDebug()<<"tmp="< "9") { //提示请在输入框1中输入在0~9之间的数字; //qDebug()<<"please input number from 0 to9 in lineEdit1"; outStr = "最大最小值输入错误"; box->information(this,"错误",outStr); return; } } //循环判断第二个输入框的列表; for(int j = 1; j < list2.size() - 1; j++) { QString tmp2 = list2.at(j); qDebug()<<"tmp2"< "9") { //提示请在输入框2中输入在0~9之间的数字; //qDebug()<<"please input number from 0 to9 in lineEdit2"; outStr = "最大最小值输入错误"; box->information(this,"错误",outStr); return; } } //----------------------进行判断点的识别-----------------------; //获取原图像; QString path = m_imgPath ; QImage *image = new QImage(); image->load(path); //1.获取图像像素字节数据的首地址 ---将二值化图像转换为数组 unsigned int *data = (unsigned int *)image->bits(); int width =image->width();//图像宽; int height = image->height();//图像高; int red; int green; int blue; int pointHeight = 0; int pointWidth = 0; int pointNum = 0; int size = width * (height - 12);//获取数组的个数; for(int i = 1; i < size; i++) { red = qRed(data[i]); green = qGreen(data[i]); blue = qBlue(data[i]); //判断该像素 是否是合格点的第一个像素,符合才需要进行宽与高的计算; if(red == 255 && green == 255 && blue == 255) { int frontRed = qRed(data[i-1]); int frontGreen = qGreen(data[i-1]); int frontBlue = qBlue(data[i-1]); //判断该像素的前一个像素是否为黑色; if(frontRed == 0 && frontGreen == 0 && frontBlue == 0) { int temp = i; //qDebug()< k) { pointHeight = n; tempMid = midNum; } else { pointHeight = n; tempMid = midNum; } } //对高取中间值,从而计算宽度; int mid = 0; int midFront = 0; int countNum = 0; int leftRed; int leftGreen; int leftBlue; int rightRed; int rightGreen; int rightBlue; if(pointHeight % 2 != 0) { //如果行高数为奇数 countNum = pointHeight / 2; mid = midNum + countNum * width; leftRed = qRed(data[mid]); leftGreen = qGreen(data[mid]); leftBlue = qBlue(data[mid]); rightRed = qRed(data[mid]); rightGreen = qGreen(data[mid]); rightBlue = qBlue(data[mid]); //根据中间坐标判断左右是否为白色,然后计算宽度; int k = 0; //qDebug()<<"k的值为:"< temp_width2) { max = temp_width; } else { max = temp_width; } pointWidth = max; } //比较计算得到的最大高度与宽度 是否在给定的最大直径和最小直径; if(pointHeight >= minCount && pointHeight <= maxCount) { if(pointWidth >= minCount && pointWidth <= maxCount) { pointNum++; } } } } } } //将点的个数显示在对应的label中; ui->labelPointSum->setText(QString("%1").arg(pointNum)); } } }