#include "widget.h" #include "ui_widget.h" #include #include #include #include "thread.h" #include #include #include //#include #include "src/modbus.h" # pragma execution_character_set("utf-8") #define ResultPath "D:/Log.txt" Process_img * process_img; modbus_t* plc1; camera *m_camera = nullptr; correct *m_correct = nullptr; extern QSemaphore usebuff; QSemaphore plc_signal(0); int save_flag; //保存标志位 uint8_t learning_flag; uint8_t light_flag; uint8_t middle_flag; uint8_t dark_flag; int m_index; uint8_t adjust_exit_flag; uint8_t adjust_correct_flag; uint8_t restart_flag; int a = 0, b = 0, c = 0; #define SAVE_IMAGE_PATH "E:/527picture/" #define WHITE_IMAGE_PATH "C:/Users/USER/Desktop/wood_aduiduiduiplus/build-wooden-Desktop_Qt_5_9_5_MSVC2017_64bit-Release/white" #define BLACK_IMAGE_PATH "C:/Users/USER/Desktop/wood_aduiduiduiplus/build-wooden-Desktop_Qt_5_9_5_MSVC2017_64bit-Release/black" #define CORRECT_WIDTH 4096 #define CORRECT_HEIGHT 3000 #define Train_number 30 #define changeModel_path "D:/wood_color317/models" QString DirPath = "D:/picture/527paper"; Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { // qDebug() << "1111111111111111"; ui->setupUi(this); m_camera = new camera; init_window(); plc_connect(); ui->btn_Tab2_stop->setEnabled(false); save_flag = 0; send_thread = new SendThread(); recv_thread = new RecvThread(); send_thread->start(); recv_thread->start(); connect_signals(); ui->btn_Tab2_light->setEnabled(false); ui->btn_Tab2_middle->setEnabled(false); ui->btn_Tab2_dark->setEnabled(false); ui->btn_Tab2_train->setEnabled(false); ui->btn_Tab2_Preprocessing->setEnabled(false); ui->btn_Tab2_show->setEnabled(false); learning_flag = 0; light_flag = 0; middle_flag = 0; dark_flag = 0; adjust_exit_flag = 0; adjust_correct_flag = 0; restart_flag = 0; restart_thread = new RestartThread(); restart_thread->start(); ui->btn_Tab4_black->hide(); ui->btn_Tab2_start_2->hide(); ui->btn_Tab2_start_3->hide(); ui->btn_Tab2_start_4->hide(); ui->btn_Tab4_wbcorrect->setEnabled(false); ui->btn_Tab4_exit->setEnabled(false); } Widget::~Widget() { delete ui; delete [] m_camera->black_buf; delete [] m_camera->white_buf; } void Widget::plc_connect() { int status = -1; plc1 = modbus_new_rtu("COM7", 115200, 'N', 8, 1); modbus_set_slave(plc1, 4); //设置modbus从机地址 status = modbus_connect(plc1); if(status == -1) { qDebug() << "modbus connect failed"; } modbus_set_response_timeout(plc1, 0, 1000000); qDebug() << "status" << status; qDebug() << "connect plc success"; } void Widget::connect_signals() { //Tab_1 connect(ui->btn_Tab1_1, SIGNAL(clicked()), this, SLOT(btn_Tab1_1_click())); connect(ui->btn_Tab1_2, SIGNAL(clicked()), this, SLOT(btn_Tab1_2_click())); //Tab_2 connect(ui->btn_Tab2_mainMenu, SIGNAL(clicked()), this, SLOT(btn_Tab2_mainMenu_click())); connect(ui->btn_Tab2_start, SIGNAL(clicked()), this, SLOT(btn_Tab2_start_click())); connect(ui->btn_Tab2_stop, SIGNAL(clicked()), this, SLOT(btn_Tab2_stop_click())); connect(ui->btn_Tab2_autoLearning, SIGNAL(clicked()), this, SLOT(btn_Tab2_autoLearning_click())); connect(ui->btn_Tab2_light, SIGNAL(clicked()), this, SLOT(btn_Tab2_light_click())); connect(ui->btn_Tab2_middle, SIGNAL(clicked()), this, SLOT(btn_Tab2_middle_click())); connect(ui->btn_Tab2_dark, SIGNAL(clicked()), this, SLOT(btn_Tab2_dark_click())); connect(ui->btn_Tab2_train, SIGNAL(clicked()), this, SLOT(btn_Tab2_train_click())); //Tab_3 connect(ui->btn_Tab3_cameraParasettings, SIGNAL(clicked()), this, SLOT(btn_Tab3_cameraParasettings_click())); connect(ui->btn_Tab3_mainMenu, SIGNAL(clicked()), this, SLOT(btn_Tab3_mainMenu_click())); connect(ui->btn_Tab3_saveImg, SIGNAL(clicked()), this, SLOT(btn_Tab3_saveImg_click())); connect(ui->btn_Tab3_changeModel, SIGNAL(clicked()), this, SLOT(btn_Tab3_changeModel_click())); //Tab_4 connect(ui->btn_Tab4_return, SIGNAL(clicked()), this, SLOT(btn_Tab4_return_click())); connect(ui->btn_Tab4_getCorrect, SIGNAL(clicked()), this, SLOT(btn_Tab4_getCorrect_click())); connect(ui->btn_Tab4_black, SIGNAL(clicked()), this, SLOT(btn_Tab4_black_click())); connect(ui->btn_Tab4_white, SIGNAL(clicked()), this, SLOT(btn_Tab4_white_click())); connect(ui->btn_Tab4_wbcorrect, SIGNAL(clicked()), this, SLOT(btn_Tab4_wbcorrect_click())); //Tab_5 connect(ui->btn_Tab5_skip, SIGNAL(clicked()), this, SLOT(btn_Tab5_skip_click())); connect(recv_thread, SIGNAL(SendPicInfo(char*)), this, SLOT(showPic(char*)), Qt::BlockingQueuedConnection); } void Widget::init_window() { ui->tabWidget->findChildren().at(0)->hide(); ui->btn_Tab2_dark->hide(); ui->tabWidget->setCurrentIndex(4); if(!m_camera->openCamera()) { qDebug() << "open camera failed"; return; } //校正 m_camera->white_mat = cv::Mat(CORRECT_HEIGHT, CORRECT_WIDTH, CV_32FC3, cv::Scalar(0, 0, 0)); m_camera->black_mat = cv::Mat(CORRECT_HEIGHT, CORRECT_WIDTH, CV_32FC3, cv::Scalar(0, 0, 0)); m_camera->eps = cv::Mat(CORRECT_HEIGHT, CORRECT_WIDTH, CV_32FC3, cv::Scalar(0.00000001, 0.00000001, 0.00000001)); m_camera->white_buf = new float[CORRECT_WIDTH*CORRECT_HEIGHT*3*4]; m_camera->black_buf = new float[CORRECT_WIDTH*CORRECT_HEIGHT*3*4]; FILE* fp; fp = fopen(WHITE_IMAGE_PATH, "rb"); fread(m_camera->white_buf, 4, CORRECT_WIDTH*CORRECT_HEIGHT*3*4, fp); fclose(fp); fp = fopen(BLACK_IMAGE_PATH, "rb"); fread(m_camera->black_buf, 4, CORRECT_WIDTH*CORRECT_HEIGHT*3*4, fp); fclose(fp); m_camera->white_mat = cv::Mat(CORRECT_HEIGHT, CORRECT_WIDTH, CV_32FC3, m_camera->white_buf); m_camera->black_mat = cv::Mat(CORRECT_HEIGHT, CORRECT_WIDTH, CV_32FC3, m_camera->black_buf); skip = new QTimer(); connect(skip, SIGNAL(timeout()), this, SLOT(skip_Notime())); skip->start(30000); } //Tab1 void Widget::btn_Tab1_1_click() { ui->tabWidget->setCurrentIndex(1); } void Widget::btn_Tab1_2_click() { ui->tabWidget->setCurrentIndex(2); } //Tab2 void Widget::showlabel(cv::Mat img) { // qDebug() << count++; // qDebug() << "save_flag: " << save_flag; int counter = 0; counter++; // qDebug() << "counter: " << counter; // if(save_flag && counter == 1) // { //// QDateTime time = QDateTime::currentDateTime(); //// QString str = time.toString("yyyyMMddhhmmss"); //// QString filepath = SAVE_IMAGE_PATH + str + ".png"; //// qDebug() << filepath; //// cv::imwrite(filepath.toLatin1().data(), img); // char fileName[64]; // sprintf(fileName, "D:/save_image/rgb%d.png", m_index); // m_index++; // qDebug() << fileName; // cv::imwrite(fileName, img); // counter = 0; // } static uint8_t light_index = 0; if(learning_flag && counter == 1 && light_flag) { qDebug() << "learning light saved"; qDebug() << "light_index: " << light_index; char str[32]; //使用sprintf补0,QString使用.toLatin1().data()改变Path的格式 char file[16]; sprintf(file, "rgb%02d.png", light_index);//定义图片保存名file QString Name = QString(QLatin1String(file)); QString fileName = DirPath + "//hua//" + Name;//形如D://2023//wooden//2023318//light//rgb00.png sprintf(str, "light number:%d", ++light_index); if(light_index == Train_number) { cv::imwrite(fileName.toLatin1().data(), img); ui->label_showSorting->setText("花纹木板采集完成"); m_camera->stopCapture(); ui->btn_Tab2_middle->setEnabled(true); light_flag = 0; } else { QString s = QString(str); ui->label_showSorting->setText(s); qDebug() << fileName; cv::imwrite(fileName.toLatin1().data(), img); } counter = 0; } static uint8_t middle_index = 0; if(learning_flag && counter == 1 && middle_flag) { qDebug() << "learning middle saved"; qDebug() << "middle_index: " << middle_index; char str[32]; char file[16]; sprintf(file, "rgb%02d.png", middle_index + 30);//定义图片保存名file QString Name = QString(QLatin1String(file)); QString fileName = DirPath + "//zhi//" + Name; // sprintf(fileName, "E:/autoLearning/middle/rgb%02d.png", middle_index); sprintf(str, "middle number:%d", ++middle_index); if(middle_index == Train_number) { cv::imwrite(fileName.toLatin1().data(), img); ui->label_showSorting->setText("直纹木板采集完成"); m_camera->stopCapture(); ui->btn_Tab2_dark->setEnabled(true); middle_flag = 0; } else { QString s = QString(str); ui->label_showSorting->setText(s); qDebug() << fileName; cv::imwrite(fileName.toLatin1().data(), img); } counter = 0; } // static uint8_t dark_index = 0; // if(learning_flag && counter == 1 && dark_flag) // { // qDebug() << "learning dark saved"; // qDebug() << "dark_index: " << dark_index; // char str[32]; // char file[16]; // sprintf(file, "rgb%02d.png", dark_index + 60);//定义图片保存名file // QString Name = QString(QLatin1String(file)); // QString fileName = DirPath + "//dark//" + Name; //// sprintf(fileName, "E:/autoLearning/dark/rgb%02d.png", dark_index); // sprintf(str, "dark number:%d", ++dark_index); // if(dark_index == Train_number) // { // cv::imwrite(fileName.toLatin1().data(), img); // ui->label_showSorting->setText("深色木板采集完成"); // m_camera->stopCapture(); // ui->btn_Tab2_Preprocessing->setEnabled(true); // dark_flag = 0; // } // else // { // QString s = QString(str); // ui->label_showSorting->setText(s); // qDebug() << fileName; // cv::imwrite(fileName.toLatin1().data(), img); // } // counter = 0; // } // char fileName[64]; // sprintf(fileName, "E:/88/rgb%d.png", m_index++); // cv::imwrite(fileName, img); cv::cvtColor(img, img, CV_BGR2RGB); const unsigned char *pSrc = (const unsigned char*)img.data; QImage image(pSrc, img.cols, img.rows, img.step, QImage::Format_RGB888); pix = QPixmap::fromImage(image.scaled(ui->showlabel->width(), ui->showlabel->height(), Qt::KeepAspectRatio)); ui->showlabel->setPixmap(pix); ui->showlabel->show(); // Sleep(150); m_camera->m_buffer->Clear(); } void Widget::btn_Tab2_start_click() { learning_flag = 0; // m_camera->m_pAcq->SetParameter(CORACQ_PRM_FRAME_LENGTH, CORACQ_VAL_FRAME_LENGTH_VARIABLE, TRUE); process_img = new Process_img(this); connect(process_img, SIGNAL(show_img(cv::Mat)), this, SLOT(showlabel(cv::Mat)), Qt::BlockingQueuedConnection); connect(recv_thread, SIGNAL(send_sortingResult(char*)), this, SLOT(showlabelSorting(char*)), Qt::BlockingQueuedConnection); // connect(recv_thread, SIGNAL(SendPicInfo(char*)), this, SLOT(showPic(char*)), Qt::BlockingQueuedConnection); m_camera->startCapture(); process_img->start(); ui->btn_Tab2_start->setEnabled(false); ui->btn_Tab2_stop->setEnabled(true); //打印分选时间戳 QDateTime curDateTime = QDateTime::currentDateTime(); QString tmp1 =curDateTime.toString("yyyy-MM-dd hh:mm:ss"); QByteArray tmp2 = tmp1.toLatin1(); tmp2.append(QString::fromUtf8("开始分选\n")); int len = tmp2.size(); char* ch = tmp2.data(); FILE* fp; fp = fopen(ResultPath, "a+"); fwrite(ch, len, 1, fp); fclose(fp); ch = NULL; } void Widget::btn_Tab2_stop_click() { qDebug() << "S: " << a; qDebug() << "Z: " << b; qDebug() << "Q: " << c; /***************打印时间戳分选结果(形如Q:0 Z:0 S:0 sum:0)*************/ FILE* fp; fp = fopen(ResultPath, "a+"); QString Result = "Q:" + QString::number(c) + " Z:" + QString::number(b) + " S:" + QString::number(a) + " sum:" + QString::number(count); char* ch = Result.toLatin1().data(); int len = Result.size(); fwrite(ch, len, 1, fp); QDateTime curDateTime = QDateTime::currentDateTime(); QString tmp1 =curDateTime.toString("\nyyyy-MM-dd hh:mm:ss"); QByteArray tmp2 = tmp1.toLatin1(); tmp2.append(QString::fromUtf8("结束分选\n\n")); len = tmp2.size(); ch = tmp2.data(); fwrite(ch, len, 1, fp); fclose(fp); ch = NULL; /*** **** ***** **** ***/ disconnect(process_img, SIGNAL(show_img(cv::Mat)), this, SLOT(showlabel(cv::Mat))); disconnect(recv_thread, SIGNAL(send_sortingResult(char*)), this, SLOT(showlabelSorting(char*))); qDebug() << "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; m_camera->stopCapture(); // a->closeCamera(); process_img->exitThread(); process_img->wait(); if(process_img->isFinished()) qDebug() <<"process thread finish"; delete process_img; ui->btn_Tab2_start->setEnabled(true); ui->btn_Tab2_stop->setEnabled(false); a = 0; b = 0; c = 0; count = 0; } void Widget::btn_Tab2_mainMenu_click() { ui->tabWidget->setCurrentIndex(0); } void Widget::showlabelSorting(char *buf) { uint16_t tmp = 0; // qDebug() << "AAAAAAAAAAA"; switch(buf[0]) { case 'H': ++a; // qDebug() << "S:" << a; tmp = 0; ui->label_showSorting->setText(QString::fromStdString("花纹")); if(modbus_write_registers(plc1, 0x400002, 1, &tmp) == -1) qDebug() << "dark write error"; qDebug() << "识别结果:" << tmp; Sleep(10); tmp = 1; if(modbus_write_registers(plc1, 0x400001, 1, &tmp) == -1) qDebug() << "R1 error"; break; case 'Z': ++b; // qDebug() << "Z:" << b; tmp = 1; ui->label_showSorting->setText(QString::fromStdString("直纹")); if(modbus_write_registers(plc1, 0x400002, 1, &tmp) == -1) qDebug() << "middle write error"; qDebug() << "识别结果:" << tmp; Sleep(10); tmp = 1; if(modbus_write_registers(plc1, 0x400001, 1, &tmp) == -1) qDebug() << "R1 error"; break; // case 'Q': // ++c; //// qDebug() << "Q:" << c; // tmp = 2; // ui->label_showSorting->setText(QString::fromStdString("浅色 ")); // if(modbus_write_registers(plc1, 0x400002, 1, &tmp) == -1) // qDebug() << "light write error"; // qDebug() << "识别结果:" << tmp; // Sleep(10); // tmp = 1; // if(modbus_write_registers(plc1, 0x400001, 1, &tmp) == -1) // qDebug() << "R1 error"; // break; case 'A': ui->label_showSorting->setText(QString::fromStdString("训练模型完成")); break; case 'D': ui->label_showSorting->setText(QString::fromStdString("切换模型完成")); break; default: break; } } void Widget::btn_Tab2_autoLearning_click() { //创建存图文件夹 QString DirName = QInputDialog::getText(this,"存图路径","请输入文件夹名称(英文与数字):",QLineEdit::Normal); if(DirName.size() == 0) { QMessageBox::warning(NULL, "警告", "输入图片文件夹名为空,请重新操作!"); return; } //创建文件夹 DirPath = "D:/picture/" + DirName;//DirPath设置全局变量523 QDir dir(DirPath); if (!dir.exists()) { dir.mkdir(DirPath); } else { QMessageBox::warning(NULL, "警告", "输入图片文件夹名重复,请重新操作!"); return; } ui->btn_Tab2_light->setEnabled(true); learning_flag = 1; ui->label_showSorting->setText(QString::fromStdString("请点击保存浅色 ")); } void Widget::btn_Tab2_light_click() { QString DirPathLight = DirPath + "/hua"; QDir dir(DirPathLight); if (!dir.exists()) { dir.mkdir(DirPathLight); } light_flag = 1; ui->label_showSorting->setText(QString::fromStdString("请放花纹木板")); process_img = new Process_img(this); connect(process_img, SIGNAL(show_img(cv::Mat)), this, SLOT(showlabel(cv::Mat)), Qt::BlockingQueuedConnection); m_camera->startCapture(); process_img->start(); ui->btn_Tab2_light->setEnabled(false); } void Widget::btn_Tab2_middle_click() { QString DirPathMiddle = DirPath + "/zhi"; QDir dir(DirPathMiddle); if (!dir.exists()) { dir.mkdir(DirPathMiddle); } ui->label_showSorting->setText(QString::fromStdString("请放直纹木板")); middle_flag = 1; m_camera->startCapture(); ui->btn_Tab2_middle->setEnabled(false); } void Widget::btn_Tab2_dark_click() { QString DirPathDark = DirPath + "/dark"; QDir dir(DirPathDark); if (!dir.exists()) { dir.mkdir(DirPathDark); } dark_flag = 1; ui->label_showSorting->setText(QString::fromStdString("请放深色木板")); m_camera->startCapture(); ui->btn_Tab2_dark->setEnabled(false); } void Widget::on_btn_Tab2_Preprocessing_clicked() { char fileName[64]; // QString DirPathSolid = "D:/picture/524test/"; // sprintf(fileName, DirPathSolid.toLatin1().data()); sprintf(fileName, DirPath.toLatin1().data()); uint8_t* sendbuf = new uint8_t[strlen(fileName)+12]; sendbuf[0] = 0xAA; sendbuf[1] = 0x00; sendbuf[2] = 0x00; sendbuf[3] = 0x00; sendbuf[4] = strlen(fileName)+4; sendbuf[5] = ' '; sendbuf[6] = ' '; sendbuf[7] = 'K'; sendbuf[8] = 'M'; memcpy(sendbuf+9, fileName, strlen(fileName)); sendbuf[strlen(fileName) + 9] = 0xFF; sendbuf[strlen(fileName) + 10] = 0xFF; sendbuf[strlen(fileName) + 11] = 0xBB; send_thread->send_socket->write((const char*)sendbuf, strlen(fileName) + 12); send_thread->send_socket->flush(); qDebug() << "====send DirName success===="; } void Widget::showPic(char* buf1) { qDebug() << "111"; pic = new showpic(buf1); connect(pic, SIGNAL(PictureReady()), this, SLOT(PictureProcess())); ui->btn_Tab2_show->setEnabled(true); ui->btn_Tab2_Preprocessing->setEnabled(false); } void Widget::on_btn_Tab2_show_clicked() { pic->show(); //522 ui->btn_Tab2_show->setEnabled(false); ui->btn_Tab2_train->setEnabled(true); } void Widget::btn_Tab2_train_click() { ui->btn_Tab2_train->setEnabled(false); disconnect(process_img, SIGNAL(show_img(cv::Mat)), this, SLOT(showlabel(cv::Mat))); process_img->exitThread(); process_img->wait(); if(process_img->isFinished()) qDebug() <<"process thread finish"; delete process_img; char fileName[64]; sprintf(fileName, DirPath.toLatin1().data()); // uint8_t* sendbuf = new uint8_t[strlen(fileName)+12]; //// uint8_t sendbuf[strlen(fileName) + 12]; // sendbuf[0] = 0xAA; // sendbuf[1] = 0x00; // sendbuf[2] = 0x00; // sendbuf[3] = 0x00; // sendbuf[4] = 0x13; // sendbuf[5] = ' '; // sendbuf[6] = ' '; // sendbuf[7] = 'T'; // sendbuf[8] = 'R'; // memcpy(sendbuf+9, fileName, 15); // sendbuf[strlen(fileName) + 9] = 0xFF; // sendbuf[strlen(fileName) + 10] = 0xFF; // sendbuf[strlen(fileName) + 11] = 0xBB; // send_thread->send_socket->write((const char*)sendbuf, strlen(fileName) + 12); // send_thread->send_socket->flush(); // qDebug() << "====send fileName success===="; //先定义 标题,提示框 QString ModelName = QInputDialog::getText(this,"命名","请给本次训练的模型命名:",QLineEdit::Normal); if(ModelName.size() == 0) { QMessageBox::warning(NULL, "警告", "输入模型名为空,请重新操作!"); return; } QString cut = "$"; QString Dir_ModelName = DirPath + cut + ModelName; qDebug() << "Dir+DirName" << Dir_ModelName; int len = Dir_ModelName.length(); uint8_t* assign_buf = new uint8_t[len+12]; char* ba = Dir_ModelName.toLatin1().data(); if(len > 0) { assign_buf[0] = 0xAA; assign_buf[1] = 0x00; assign_buf[2] = 0x00; assign_buf[3] = 0x00; assign_buf[4] = len+4; assign_buf[5] = ' '; assign_buf[6] = ' '; assign_buf[7] = 'T'; assign_buf[8] = 'R'; memcpy(assign_buf+9, ba, len); assign_buf[len+9] = 0xFF; assign_buf[len+10] = 0xFF; assign_buf[len+11] = 0xBB; send_thread->send_socket->write((const char*)assign_buf, len+12); send_thread->send_socket->flush(); qDebug() << "====send fileName success===="; } else { return; } } //Tab3 void Widget::btn_Tab3_cameraParasettings_click() { ui->tabWidget->setCurrentIndex(3); //设置相机参数 //设置相机采集模式 } void Widget::btn_Tab3_mainMenu_click() { ui->tabWidget->setCurrentIndex(0); } void Widget::showimage_test(cv::Mat img) { // cv::cvtColor(img, img, CV_BGRA2BGR); // cv::Mat img_gray; // cv::cvtColor(img, img_gray, CV_RGB2BGRA); cv::cvtColor(img, img, CV_BGR2RGB); int value = 0; for(int i=300; i<400; i++) { for(int j=300; j<400; j++) { value += img.ptr(i)[j]; } } float bringhtness = value / 10000.0; ui->label_Tab4_2->setText(QString("%1").arg(bringhtness)); const unsigned char *pSrc = (const unsigned char*)img.data; QImage image(pSrc, img.cols, img.rows, img.step, QImage::Format_RGB888); pix_test = QPixmap::fromImage(image.scaled(ui->showlabel_set->width(), ui->showlabel_set->height(), Qt::KeepAspectRatio)); ui->showlabel_set->setPixmap(pix_test); ui->showlabel_set->show(); } void Widget::btn_Tab3_saveImg_click() { if(save_flag == 1) { save_flag = 0; ui->btn_Tab3_saveImg->setText(QString::fromStdString("保存图片 ")); } else { save_flag = 1; ui->btn_Tab3_saveImg->setText(QString::fromStdString(" 不要保存图片 ")); } } void Widget::btn_Tab3_changeModel_click() { QString fileName = QFileDialog::getOpenFileName(NULL, "切换模型", changeModel_path, "*.p"); int len = fileName.length(); uint8_t* assign_buf = new uint8_t[len+12]; char* ba = fileName.toLatin1().data(); if(len > 0) { assign_buf[0] = 0xAA; assign_buf[1] = 0x00; assign_buf[2] = 0x00; assign_buf[3] = 0x00; assign_buf[4] = len+4; assign_buf[5] = ' '; assign_buf[6] = ' '; assign_buf[7] = 'M'; assign_buf[8] = 'D'; memcpy(assign_buf+9, ba, len); assign_buf[len+9] = 0xFF; assign_buf[len+10] = 0xFF; assign_buf[len+11] = 0xBB; send_thread->send_socket->write((const char*)assign_buf, len+12); send_thread->send_socket->flush(); } else { return; } } //Tab4 void Widget::btn_Tab4_return_click() { if(restart_flag) { ui->btn_Tab4_return->setEnabled(false); restart_thread->restr_fun(); restart_flag = 0; connect(dafei, SIGNAL(timeout()), this, SLOT(dafei_slot())); ui->btn_Tab4_return->setText("参数设置"); dafei->start(20000); ui->btn_Tab4_return->setEnabled(true); } else { ui->tabWidget->setCurrentIndex(2); } } void Widget::dafei_slot() { ui->btn_Tab4_white->setEnabled(true); ui->btn_Tab4_getCorrect->setEnabled(true); dafei->stop(); ui->btn_Tab4_return->setText("返回"); ui->tabWidget->setCurrentIndex(2); } void Widget::btn_Tab4_getCorrect_click() { m_camera->m_pAcq->SetParameter(CORACQ_PRM_EXT_FRAME_TRIGGER_ENABLE, FALSE, TRUE); m_camera->m_pAcq->SetParameter(CORACQ_PRM_FRAME_LENGTH, CORACQ_VAL_FRAME_LENGTH_FIX, TRUE); adjust_exit_flag = 1; adjust_correct_flag = 1; adjust_para = new Adjust_para(this); connect(adjust_para, SIGNAL(send_image_debug(cv::Mat)), this, SLOT(showimage_test(cv::Mat)), Qt::BlockingQueuedConnection); connect(this, SIGNAL(correct_signal()), adjust_para, SLOT(get_correct_signal())); m_camera->startCapture(); adjust_para->start(); qDebug() << "get correct"; // emit correct_signal(); ui->btn_Tab4_white->setEnabled(false); ui->btn_Tab4_exit->setEnabled(true); ui->btn_Tab4_return->setEnabled(false); } void Widget::on_btn_Tab4_exit_clicked() { disconnect(adjust_para, SIGNAL(send_image_debug(cv::Mat)), this, SLOT(showimage_test(cv::Mat))); disconnect(this, SIGNAL(correct_signal()), adjust_para, SLOT(get_correct_signal())); m_camera->stopCapture(); adjust_para->exitThread(); adjust_para->wait(); if(adjust_para->isFinished()) { qDebug() << "dajust_para thread finish"; } delete adjust_para; adjust_exit_flag = 0; adjust_correct_flag = 0; //更改相机触发模式为外触发 if(m_camera->m_pAcq->SetParameter(CORACQ_PRM_FRAME_LENGTH, 0x00000002, FALSE)) qDebug() << "set success"; else qDebug() << "set error"; m_camera->m_pAcq->SetParameter(CORACQ_PRM_EXT_FRAME_TRIGGER_ENABLE, TRUE, TRUE); if(m_camera->m_buffer && *m_camera->m_buffer) { m_camera->m_buffer->Destroy(); qDebug() << "1111"; } if(m_camera->m_pAcq && *m_camera->m_pAcq) { m_camera->m_pAcq->Destroy(); qDebug() << "2222"; } if(m_camera->m_trans) { delete m_camera->m_trans; qDebug() << "3333"; } if(m_camera->m_buffer) { delete m_camera->m_buffer; qDebug() << "4444"; } if(m_camera->m_pAcq) { delete m_camera->m_pAcq; qDebug() << "5555"; } if(m_camera->m_loc) { delete m_camera->m_loc; qDebug() << "6666"; } restart_flag = 1; ui->btn_Tab4_return->setEnabled(true); } void Widget::PictureProcess() { ui->label_showSorting->setText(QString::fromStdString("图片预处理完成")); } void Widget::btn_Tab4_black_click() { qDebug() << "black start"; // ui->btn_Tab4_black->setDisabled(true); // ui->btn_Tab4_white->setDisabled(true); //加锁 m_camera->capture_black_flag = true; // m_camera->ret_SCorrect = m_camera->startCorrect(); qDebug() << "black end"; } void Widget::btn_Tab4_white_click() { m_camera->m_pAcq->SetParameter(CORACQ_PRM_EXT_FRAME_TRIGGER_ENABLE, FALSE, TRUE); m_camera->m_pAcq->SetParameter(CORACQ_PRM_FRAME_LENGTH, CORACQ_VAL_FRAME_LENGTH_FIX, TRUE); m_camera->capture_white_flag = true; m_camera->startCorrect(); ui->btn_Tab4_getCorrect->setEnabled(false); ui->btn_Tab4_wbcorrect->setEnabled(true); ui->btn_Tab4_return->setEnabled(false); } void Widget::btn_Tab4_wbcorrect_click() { m_camera->stopCorrect(); //更改相机触发模式为外触发 m_camera->m_pAcq->SetParameter(CORACQ_PRM_FRAME_LENGTH, CORACQ_VAL_FRAME_LENGTH_VARIABLE, TRUE); m_camera->m_pAcq->SetParameter(CORACQ_PRM_EXT_FRAME_TRIGGER_ENABLE, TRUE, TRUE); FILE* fp; fp = fopen(WHITE_IMAGE_PATH, "rb"); fread(m_camera->white_buf, 4, CORRECT_WIDTH*CORRECT_HEIGHT*3*4, fp); fclose(fp); fp = fopen(BLACK_IMAGE_PATH, "rb"); fread(m_camera->black_buf, 4, CORRECT_WIDTH*CORRECT_HEIGHT*3*4, fp); fclose(fp); m_camera->white_mat = cv::Mat(CORRECT_HEIGHT, CORRECT_WIDTH, CV_32FC3, m_camera->white_buf); m_camera->black_mat = cv::Mat(CORRECT_HEIGHT, CORRECT_WIDTH, CV_32FC3, m_camera->black_buf); if(m_camera->m_buffer && *m_camera->m_buffer) { m_camera->m_buffer->Destroy(); qDebug() << "aaaa"; } if(m_camera->m_pAcq && *m_camera->m_pAcq) { m_camera->m_pAcq->Destroy(); qDebug() << "bbbb"; } if(m_camera->c_trans) { delete m_camera->c_trans; qDebug() << "cccc"; } if(m_camera->m_buffer) { delete m_camera->m_buffer; qDebug() << "dddd"; } if(m_camera->m_pAcq) { delete m_camera->m_pAcq; qDebug() << "eeee"; } if(m_camera->m_loc) { delete m_camera->m_loc; qDebug() << "ffff"; } restart_flag = 1; ui->btn_Tab4_return->setEnabled(true); } void Widget::on_btn_Tab2_start_2_clicked() { // write_modbus(0x400001, 2); // write_modbus(0x400002, 2); char fileName[64]; sprintf(fileName, "E:/autoLearning"); int len = strlen(fileName); qDebug() << len; } void Widget::on_btn_Tab2_start_3_clicked() { // write_modbus(0x400001, 1); // uint16_t tmp = 900; // int ret = modbus_write_registers(plc1, 0x400002, 1, &tmp); // if(ret == -1) // qDebug() << "write error"; // else // qDebug() << "write success"; uint16_t tmp = 0; uint16_t arr[9] = {0x400001, 0x400002, 0x400003, 0x400004, 0x400005, 0x400006, 0x400007, 0x400008, 0x400009}; for(int i = 0; i < 9; i++) { tmp = i; int ret = modbus_write_registers(plc1, arr[i], 1, &tmp); if(ret == -1) qDebug() << "write error"; else qDebug() << "write success"; Sleep(100); } } void Widget::on_btn_Tab2_start_4_clicked() { // write_modbus(0x400001, 0); uint16_t tmp = 2; int ret = modbus_read_registers(plc1, 0x400002, 1, &tmp); if(ret == -1) qDebug() << "write error"; else qDebug() << "read success: " <tabWidget->setCurrentIndex(0); skip->stop(); disconnect(skip, SIGNAL(timeout()), this, SLOT(skip_Notime())); delete skip; } void Widget::skip_Notime() { ui->tabWidget->setCurrentIndex(0); disconnect(skip, SIGNAL(timeout()), this, SLOT(skip_Notime())); delete skip; }