#include "workthread.h" #include "alg_jd.h" #include "common.h" #include "balluffcamera.h" #include "baslercamera.h" #include "threadSend.h" #include extern AlgJd alg_jd[NumberOfSupportedCameras]; //检测胶点的AI算法 extern SysConf g_sys_conf; //系统配置参数 extern DisplayLabelConf g_display_label_conf[NumberOfSupportedCameras]; extern int rotationAngle[NumberOfSupportedCameras]; //图片旋转角度 extern bool isNeddRotate[NumberOfSupportedCameras]; extern SyncQueue >* g_save_queue; //图片保存队列 extern SyncQueue >* g_image_queue[NumberOfSupportedCameras]; //int表示一个目标拍了几张 extern SyncQueue<_UDPSendInfo> *UDP_Info_queue; extern PLCDevice* m_PLCDevice; WorkThread::~WorkThread() { stop(); local_g_image_queue->put(std::make_pair(0, cv::Mat())); quit(); wait(); } void WorkThread::init(SyncQueue>* image_ptr, ASyncQueue* result_ptr, int classid, int Num) { local_camera_number = Num; local_classid = classid; local_g_image_queue = image_ptr; local_g_result_queue = result_ptr; b_quit = false; frame_total = 0; } void WorkThread::start_work() { start(HighestPriority); } void WorkThread::stop() { b_quit = true; } void WorkThread::run() { try{ uint32_t result_index = 0; while (!b_quit) { {//不要删掉这个括号,用来定义锁的作用域 std::lock_guard locker(g_sys_conf.lock); local_SysConf.save = g_sys_conf.save; local_SysConf.shoot[local_camera_number] = g_sys_conf.shoot[local_camera_number]; local_SysConf.MisMatchAct = g_sys_conf.MisMatchAct; for (int i = 0; i < 3; i++)local_SysConf.no[local_camera_number][i] = g_sys_conf.no[local_camera_number][i]; std::lock_guard locker2(g_display_label_conf[local_camera_number].lock); local_DisplayLabelConf.leftButtonDownFlag = g_display_label_conf[local_camera_number].leftButtonDownFlag; local_DisplayLabelConf.Flag[0] = g_display_label_conf[local_camera_number].Flag[0]; local_DisplayLabelConf.Flag[1] = g_display_label_conf[local_camera_number].Flag[1]; local_DisplayLabelConf.originalPoint = g_display_label_conf[local_camera_number].originalPoint; local_DisplayLabelConf.processPoint = g_display_label_conf[local_camera_number].processPoint; local_DisplayLabelConf.RectVet[0] = g_display_label_conf[local_camera_number].RectVet[0]; local_DisplayLabelConf.RectVet[1] = g_display_label_conf[local_camera_number].RectVet[1]; } QDateTime now_ts = QDateTime::currentDateTime(); std::pair element; local_g_image_queue->take(element); int unit_count = element.first; cv::Mat image = element.second; _UDPSendInfo UDPSendInfo; UDPSendInfo.FrameID = info_frame; UDPSendInfo.index = local_camera_number; if (!image.data) { continue; //图像为空,跳过 } if (image.channels() == 1) { cv::cvtColor(image, image, CV_BGR2RGB); //灰度图像转为彩色图像 } if (local_SysConf.shoot[local_camera_number] == unit_count) { std::vector vec_in; int w = image.cols; int h = image.rows / unit_count; for(int index=0;index vec_out; std::vector > > vec_results; QDateTime ts_start = QDateTime::currentDateTime(); if(unit_count == 1){ std::vector > results; cv::Mat imagein,imageout; imagein = vec_in[0]; alg_jd[local_camera_number].detect(imagein, imageout, results); vec_out.push_back(imageout.clone()); vec_results.push_back(results); }else{ alg_jd[local_camera_number].detect_batch(vec_in, vec_out, vec_results); } QDateTime ts_jd = QDateTime::currentDateTime(); int time_process = ts_start.msecsTo(ts_jd); emit display_timecost(local_camera_number, time_process); UDPSendInfo.timecost = QString::number(time_process); cv::Mat image1; cv::Mat image2; QString jd_no; for(int index=0;indexput(std::make_pair(file_name.toStdString(), m)); } } if (unit_count >= 2){ image1 = vec_out[(result_index) % 2].clone(); IsNG|=CheckSelectRects(image1,vec_results,(result_index) % 2,local_DisplayLabelConf,0); }else { image1 = vec_out[0].clone(); IsNG|=CheckSelectRects(image1,vec_results,0,local_DisplayLabelConf,0); } DrawSelectRects(image1, local_DisplayLabelConf, 0); if (unit_count >= 3) { image2 = vec_out[2].clone(); DrawSelectRects(image2, local_DisplayLabelConf, 1); IsNG|=CheckSelectRects(image1,vec_results,2,local_DisplayLabelConf,1); } result_index++; if (!IsNG) { emit event_ok(local_camera_number); local_g_result_queue->put(true); } else { emit event_ng(local_camera_number); local_g_result_queue->put(false); if ((local_SysConf.save == 2) || (local_SysConf.save == 1)) { for(int index=0;indexput(std::make_pair(file_name.toStdString(), m)); m = vec_out[index].clone(); file_name = "D:/image/" + now_ts.toString("yyyy-MM-dd") + "/" + QString::number(local_camera_number + 1) + "/ng_result/" + QString::number(index)+ "/" + now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") + "_" + QString::number(index) + ".jpg"; g_save_queue->put(std::make_pair(file_name.toStdString(), m)); } } } } emit display_check_total(local_camera_number, ++frame_total); emit notify(local_camera_number, 0,image1); if(unit_count>=3) emit notify(local_camera_number, 1,image2); } else { //保证不错位 if(local_SysConf.MisMatchAct == 1)//as ng emit event_ng(local_camera_number); else if(local_SysConf.MisMatchAct == 0)//as ok emit event_ok(local_camera_number); emit display_check_total(local_camera_number, ++frame_total); qDebug() << local_camera_number<< "#camera# " << now_ts.toString("yyyy-MM-dd_HH-mm-ss_zzz_") <<"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx " << unit_count; } #ifdef __UDPSend UDP_Info_queue->put(UDPSendInfo); #endif } } catch (cv::Exception& e) { const char* err_msg = e.what(); std::cout << "exception caught: " << err_msg << std::endl; } }