#include "specificareaswidget.h" #include "ui_specificareaswidget.h" #include "deviceproxy.h" #include "deviceinfo.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "opencv2/core/core.hpp" #include "opencv2/opencv.hpp" #include "rs_settings.h" #define NUMBER 3 QImage* img=new QImage; cv::Mat imgcv;//拼接完成的图片 QImage* qimgRecv;//从python返回的img转化为qimage cv::Mat imgRecv;//从python返回的img SpecificAreasWidget::SpecificAreasWidget(QWidget *parent) : QDialog(parent), ui(new Ui::SpecificAreasWidget) { ui->setupUi(this); this->setMouseTracking(true); ui->lbImage->setMouseTracking(true); connect(DEV,SIGNAL(ShowMergeSGL()),this,SLOT(ShowMergeSlots())); // Sleep(50); // if (DEV->srcImgs.size() > 0) // { // imgcv = DEV->Func_merge(200,500); // *img = QImage(imgcv.data, imgcv.cols, imgcv.rows, QImage::Format_RGB888); // //调用完成之后把img显示在窗口上 // if((double)img->width()/(double)ui->lbImage->width() >= (double)img->height()/(double)ui->lbImage->height()) // Mul=(double)img->width()/(double)ui->lbImage->width(); // else // Mul=(double)img->height()/(double)ui->lbImage->height(); // ui->edLog->append("缩放倍数:" + QString::number(Mul,'f',3)); // *scaledimg=img->scaled(ui->lbImage->width(),ui->lbImage->height(),Qt::KeepAspectRatio); // *scaledimgInit = scaledimg->copy(); // ui->lbImage->setPixmap(QPixmap::fromImage(*scaledimg)); // } } SpecificAreasWidget::~SpecificAreasWidget() { delete ui; } //显示窗口上的坐标 void SpecificAreasWidget::mouseMoveEvent(QMouseEvent *e) { if( e->x() >= ui->lbImage->pos().x() && e->y() >= ui->lbImage->pos().y() && e->x() <= ui->lbImage->pos().x() + scaledimg->width() && e->y() <= ui->lbImage->pos().y() + scaledimg->height() ) { int x = (e->x()-ui->lbImage->pos().x()) * Mul; int y = (e->y()-ui->lbImage->pos().y()) * Mul; QString strX; QString strY; strX = QString::number(x,10); strY = QString::number(y,10); QString strCoordinate = "坐标: ( " + strX + ", " + strY + " )"; //ui->labCoordinate->setText(strCoordinate); } } ////点击绘制坐标点 void SpecificAreasWidget::mousePressEvent(QMouseEvent *e) { int lx = ui->lbImage->pos().x(); int ly = ui->lbImage->pos().y(); if( e->x() >= ui->lbImage->pos().x() && e->y() >= ui->lbImage->pos().y() && e->x() <= ui->lbImage->pos().x() + scaledimg->width() && e->y() <= ui->lbImage->pos().y() + scaledimg->height() ) { int x = (e->x()-ui->lbImage->pos().x()) * Mul; int y = (e->y()-ui->lbImage->pos().y()) * Mul; QString strX; QString strY; strX = QString::number(x,10); strY = QString::number(y,10); QString strCoordinate; QVector vec; vec.append(x); vec.append(y); if(e->buttons() == Qt::LeftButton) { vec.append(1); strCoordinate = "添加坐标: ( " + strX + ", " + strY + ", 1" + " )"; QPainter painter(scaledimg); // 创建一个QPainter对象,用于绘制图形 painter.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿 QPen pen(Qt::red, 2); // 创建画笔对象,颜色为黑色,线宽为2像素 painter.setPen(pen); painter.drawLine(e->x()-lx-5, e->y()-ly-5,e->x()-lx+5, e->y()-ly+5); painter.drawLine(e->x()-lx-5, e->y()-ly+5,e->x()-lx+5, e->y()-ly-5); ui->lbImage->setPixmap(QPixmap::fromImage(*scaledimg)); } else if(e->buttons() == Qt::RightButton) { vec.append(0); strCoordinate = "添加坐标: ( " + strX + ", " + strY + ", 0" + " )"; QPainter painter(scaledimg); // 创建一个QPainter对象,用于绘制图形 painter.setRenderHint(QPainter::Antialiasing); // 设置抗锯齿 QPen pen(Qt::blue, 2); // 创建画笔对象,颜色为黑色,线宽为2像素 painter.setPen(pen); painter.drawLine(e->x()-lx-5, e->y()-ly-5,e->x()-lx+5, e->y()-ly+5); painter.drawLine(e->x()-lx-5, e->y()-ly+5,e->x()-lx+5, e->y()-ly-5); ui->lbImage->setPixmap(QPixmap::fromImage(*scaledimg)); } All.append(vec); ui->edLog->append(strCoordinate); } } void SpecificAreasWidget::on_pbOk_clicked() { DEVICE_INFO->printDeviceSystemInfo("手动加工继续!"); DEV->DataCheckFlag = true; this->close(); //调用完成之后把img显示在窗口上 // filename = QFileDialog::getOpenFileName(); // if(filename.isEmpty()) // return; // if(! ( img->load(filename) ) ) //加载图像 // { // QMessageBox::information(this, // tr("打开图像失败"), // tr("打开图像失败!")); // delete img; // return; // } // if((double)img->width()/(double)ui->lbImage->width() >= (double)img->height()/(double)ui->lbImage->height()) // Mul=(double)img->width()/(double)ui->lbImage->width(); // else // Mul=(double)img->height()/(double)ui->lbImage->height(); // ui->edLog->append("缩放倍数:" + QString::number(Mul,'f',3)); // *scaledimg=img->scaled(ui->lbImage->width(),ui->lbImage->height(),Qt::KeepAspectRatio); // *scaledimgInit = scaledimg->copy(); // ui->lbImage->setPixmap(QPixmap::fromImage(*scaledimg)); } void SpecificAreasWidget::on_pbCancel_clicked() { DEVICE_INFO->printDeviceSystemInfo("手动加工取消!"); //emit DEV->MsgLogInSuccess(false); DEV->DataCheckFlag = false; this->close(); } void SpecificAreasWidget::on_rbSrcImg_clicked() { if (ui->rbSrcImg->isChecked()) { //if (DEV->srcImgs[0].data != nullptr) { RS_SETTINGS->beginGroup("device/Rposition"); double GlobalPix = RS_SETTINGS->readNumDEntry("/GlobalPix"); int StartPos = RS_SETTINGS->readNumDEntry("/StartPos"); RS_SETTINGS->endGroup(); //imgcv = DEV->Func_merge(StartPos,StartPos+(int)GlobalPix*10); cv::cvtColor(imgcv, imgcv, cv::COLOR_BGR2RGB); *img = QImage(imgcv.data, imgcv.cols, imgcv.rows, QImage::Format_RGB888); //调用完成之后把img显示在窗口上 if((double)img->width()/(double)ui->lbImage->width() >= (double)img->height()/(double)ui->lbImage->height()) Mul=(double)img->width()/(double)ui->lbImage->width(); else Mul=(double)img->height()/(double)ui->lbImage->height(); ui->edLog->append("缩放倍数:" + QString::number(Mul,'f',3)); *scaledimg=img->scaled(ui->lbImage->width(),ui->lbImage->height(),Qt::KeepAspectRatio); *scaledimgInit = scaledimg->copy(); ui->lbImage->setPixmap(QPixmap::fromImage(*scaledimg)); } } } void SpecificAreasWidget::on_rbDstImg_clicked() { if (ui->rbDstImg->isChecked()) { if (!imgRecv.empty()) { const uchar *pSrc = (const uchar*)imgRecv.data; QImage qimgRecv(pSrc, imgRecv.cols, imgRecv.rows, imgRecv.step, QImage::Format_RGB888); //调用完成之后把img显示在窗口上 if((double)qimgRecv.width()/(double)ui->lbImage->width() >= (double)qimgRecv.height()/(double)ui->lbImage->height()) Mul=(double)qimgRecv.width()/(double)ui->lbImage->width(); else Mul=(double)qimgRecv.height()/(double)ui->lbImage->height(); ui->edLog->append("缩放倍数:" + QString::number(Mul,'f',3)); *scaledimg=qimgRecv.scaled(ui->lbImage->width(),ui->lbImage->height(),Qt::KeepAspectRatio); *scaledimgInit = scaledimg->copy(); ui->lbImage->setPixmap(QPixmap::fromImage(*scaledimg)); } } } void SpecificAreasWidget::ShowMergeSlots() { ui->rbDstImg->setChecked(true); { if (!imgRecv.empty()) { const uchar *pSrc = (const uchar*)imgRecv.data; /*************************************************************** * 修改码:1008610010 * 日期: * 2024.3.1 * 功能: * 小面识别功能的图片显示bug修改 * 描述: * Format_Grayscale8改为Format_RGB888 **************************************************************/ QImage qimgRecv(pSrc, imgRecv.cols, imgRecv.rows, imgRecv.step, QImage::Format_RGB888); //调用完成之后把img显示在窗口上 if((double)qimgRecv.width()/(double)ui->lbImage->width() >= (double)qimgRecv.height()/(double)ui->lbImage->height()) Mul=(double)qimgRecv.width()/(double)ui->lbImage->width(); else Mul=(double)qimgRecv.height()/(double)ui->lbImage->height(); ui->edLog->append("缩放倍数:" + QString::number(Mul,'f',3)); *scaledimg=qimgRecv.scaled(ui->lbImage->width(),ui->lbImage->height(),Qt::KeepAspectRatio); *scaledimgInit = scaledimg->copy(); ui->lbImage->setPixmap(QPixmap::fromImage(*scaledimg)); } } } void SpecificAreasWidget::on_pbGetRetImg_clicked() { //图片 std::vector buf; cv::imencode(".jpg", imgcv, buf); QByteArray data(reinterpret_cast(buf.data()), buf.size()); QDataStream stream(DEV->socket); stream.setByteOrder(QDataStream::BigEndian); quint32 size = data.size(); stream << size; ui->edLog->append("size = " + QString::number(size,10)); DEV->socket->write(data); ui->edLog->append("finish"); // 定义要发送的坐标点 QVector points; for(int i = 0;i < All.size();i++) { QVector3D point111(All[i][0],All[i][1],All[i][2]); points.append(point111); } QDataStream out(DEV->socket); out.setByteOrder(QDataStream::BigEndian); // 发送坐标点的数量 quint32 num_points = points.size(); out << num_points; DEV->socket->waitForBytesWritten(); ui->edLog->append(QString::number(num_points,10)); for (const QVector3D& point : points) { quint32 x = point.x(); quint32 y = point.y(); quint32 z = point.z(); out << x << y << z; DEV->socket->waitForBytesWritten(); } }