342 lines
11 KiB
C++
342 lines
11 KiB
C++
#include "specificareaswidget.h"
|
||
#include "ui_specificareaswidget.h"
|
||
|
||
#include "deviceproxy.h"
|
||
#include "deviceinfo.h"
|
||
|
||
#include <QFile>
|
||
#include <QFileDialog>
|
||
#include <QMessageBox>
|
||
#include <QMouseEvent>
|
||
#include <QPainter>
|
||
#include <QPixmap>
|
||
#include <QDataStream>
|
||
#include <QBuffer>
|
||
|
||
#include <QTcpServer>
|
||
#include <QTcpSocket>
|
||
#include <QVector3D>
|
||
#include <opencv2/highgui/highgui.hpp>
|
||
#include <opencv2/imgproc/imgproc.hpp>
|
||
#include <dirent.h>
|
||
#include <string>
|
||
#include <vector>
|
||
#include <algorithm>
|
||
#include <QtCore/QDebug>
|
||
#include <QtGui/QImage>
|
||
#include "opencv2/core/core.hpp"
|
||
#include "opencv2/opencv.hpp"
|
||
#include "rs_settings.h"
|
||
#define NUMBER 3
|
||
|
||
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<int> 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);
|
||
//QImage img = QImage(imgcv.data, imgcv.cols, imgcv.rows, QImage::Format_RGB888);
|
||
QImage img= QImage(imgcv.data,imgcv.cols, imgcv.rows,imgcv.cols*3, QImage::Format_RGB888);
|
||
//调用完成之后把img显示在窗口上
|
||
|
||
// QString fileName = QFileDialog::getSaveFileName(this, tr("png file"), qApp->applicationDirPath(),
|
||
// tr("Files (*.png)"));
|
||
// img.save(fileName);
|
||
|
||
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);
|
||
QImage qimgRecv(imgRecv.data,imgRecv.cols, imgRecv.rows,imgRecv.cols*3, 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);
|
||
QImage qimgRecv(imgRecv.data,imgRecv.cols, imgRecv.rows,imgRecv.cols*3, 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<uchar> buf;
|
||
cv::imencode(".jpg", imgcv, buf);
|
||
QByteArray data(reinterpret_cast<char*>(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<QVector3D> 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();
|
||
}
|
||
|
||
|
||
}
|