Files
newspark110/device/ui/specificareaswidget.cpp

342 lines
11 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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();
}
}