| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872 |
- #include "inferthread.h"
- #include <QTimer>
- #include <ctime>
- void InferThread::setStopBtn(QPushButton *btn)
- {
- btnStop = btn;
- }
- void InferThread::setInferBtn(QPushButton *btn)
- {
- btnInfer = btn;
- }
- void InferThread::setDetThreshold(float threshold)
- {
- det_Threshold = threshold;
- }
- void InferThread::setInferDelay(int delay)
- {
- infer_Delay = delay;
- }
- uchar *InferThread::get_color_map_list(int num_classes)
- {
- uchar *color_list = new uchar[num_classes * 3];
- num_classes += 1;
- for (int i = 1; i < num_classes; i++)
- {
- int j = 0;
- int lab = i;
- while (lab != 0)
- {
- color_list[(i-1) * 3] |= (uchar)(((lab >> 0) & 1) << (7 - j));
- color_list[(i-1) * 3 + 1] |= (uchar)(((lab >> 1) & 1) << (7 - j));
- color_list[(i-1) * 3 + 2] |= (uchar)(((lab >> 2) & 1) << (7 - j));
- j += 1;
- lab >>= 3;
- }
- }
- return color_list;
- }
- InferThread::InferThread(QObject *parent) : QThread(parent)
- {
- doing_Infer = false;
- break_Infer = false;
- dataLoaded = false; // false: Unloaded data
- color_map = get_color_map_list();
- model_Type = "det";
- image_path = "";
- images_path = QStringList();
- video_path = "";
- label1_image = nullptr;
- label2_image = nullptr;
- image1 = nullptr;
- image2 = nullptr;
- }
- void InferThread::setModelType(QString &model_type)
- {
- if (model_type=="det") // Check whether the type is met, otherwise set ""
- {
- model_Type = model_type;
- return;
- }
- else if (model_type=="seg")
- {
- model_Type = model_type;
- return;
- }
- else if (model_type=="clas")
- {
- model_Type = model_type;
- return;
- }
- else if (model_type=="mask")
- {
- model_Type = model_type;
- return;
- }
- else
- {
- // set empty
- model_Type = "";
- }
- }
- void InferThread::setInputImage(QString &image_path)
- {
- this->image_path = image_path;
- this->images_path = QStringList();
- this->video_path = "";
- dataLoaded = true;
- }
- void InferThread::setInputImages(QStringList &images_path)
- {
- this->images_path = images_path;
- this->image_path = "";
- this->video_path = "";
- dataLoaded = true;
- }
- void InferThread::setInputVideo(QString &video_path)
- {
- this->video_path = video_path;
- this->image_path = "";
- this->images_path = QStringList();
- dataLoaded = true;
- }
- void InferThread::setInferFuncs(Det_ModelPredict det_Inferfunc, Seg_ModelPredict seg_Inferfunc, Cls_ModelPredict cls_Inferfunc, Mask_ModelPredict mask_Inferfunc)
- {
- det_ModelPredict = det_Inferfunc;
- seg_ModelPredict = seg_Inferfunc;
- cls_ModelPredict = cls_Inferfunc;
- mask_ModelPredict = mask_Inferfunc;
- }
- void InferThread::runInferDet()
- {
- if (doing_Infer == false)
- {
- if (is_InferImage())
- {
- Det_Image();
- }
- else if (is_InferImages())
- {
- Det_Images();
- }
- else if (is_InferVideo())
- {
- Det_Video();
- }
- }
- else
- {
- // TODO
- }
- }
- void InferThread::runInferSeg()
- {
- if (doing_Infer == false)
- {
- if (is_InferImage())
- {
- Seg_Image();
- }
- else if (is_InferImages())
- {
- Seg_Images();
- }
- else if (is_InferVideo())
- {
- Seg_Video();
- }
- }
- else
- {
- // TODO
- }
- }
- void InferThread::runInferCls()
- {
- if (doing_Infer == false)
- {
- if (is_InferImage())
- {
- Cls_Image();
- }
- else if (is_InferImages())
- {
- Cls_Images();
- }
- else if (is_InferVideo())
- {
- Cls_Video();
- }
- }
- else
- {
- // TODO
- }
- }
- void InferThread::runInferMask()
- {
- if (doing_Infer == false)
- {
- if (is_InferImage())
- {
- Mask_Image();
- }
- else if (is_InferImages())
- {
- Mask_Images();
- }
- else if (is_InferVideo())
- {
- Mask_Video();
- }
- }
- else
- {
- // TODO
- }
- }
- // The thread actually runs the configuration
- void InferThread::run()
- {
- if (model_Type == "det")
- {
- runInferDet();
- }
- else if (model_Type == "seg")
- {
- runInferSeg();
- }
- else if (model_Type == "clas")
- {
- runInferCls();
- }
- else if (model_Type == "mask")
- {
- runInferMask();
- }
- }
- bool InferThread::is_InferImage()
- {
- if (image_path.isEmpty()) return false;
- else return true;
- }
- bool InferThread::is_InferImages()
- {
- if (images_path.isEmpty()) return false;
- else return true;
- }
- bool InferThread::is_InferVideo()
- {
- if (video_path.isEmpty()) return false;
- else return true;
- }
- QString InferThread::makeLabelInfo(QString label, int id, float score)
- {
- QString describe_str = QString::number(id) + ":";
- describe_str += label + "-";
- describe_str += QString::number(score);
- return describe_str;
- }
- void InferThread::Det_Image()
- {
- // Read the picture
- Mat image = imread(image_path.toLocal8Bit().toStdString()); //BGR
- if (image.cols > 512 || image.rows > 512)
- {
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4)); // Make sure pixMap displays properly - cut to scale images
- }
- // Predict output result
- float bboxs[600];
- int bbox_num[1];
- char labellist[1000];
- // Set the start reasoning state
- doing_Infer = true;
- try {
- clock_t start_infer_time = clock();
- // Perform reasoning and get results
- qDebug() << "Doing Det-Infer." << "\n";
- det_ModelPredict((const uchar*)image.data, image.cols, image.rows, 3, bboxs, bbox_num, labellist);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- // Set the end reasoning state
- doing_Infer = false;
- qDebug() << "Finished Det-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- // btnStop->setEnabled(false); // When reasoning is complete, close the button of reasoning interruption to prevent late point
- // btnInfer->setEnabled(true); // When the reasoning is complete, the button for the execution of the reasoning is opened to allow the reasoning again
- return;
- }
- // Post-processing
- cvtColor(image, image, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(image.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(image.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- QString labels(labellist);
- QStringList label_list = labels.split(' '); // Get Label
- for (int i = 0; i < bbox_num[0]; i++)
- {
- int categry_id = (int)bboxs[i*6];
- float score = bboxs[i*6 + 1];
- int left_topx = (int)bboxs[i*6 + 2];
- int left_topy = (int)bboxs[i*6 + 3];
- int right_downx = left_topx + (int)bboxs[i*6 + 4]; // Parameters 4 and 5 are width and height, but the same DLL using c# is the lower right vertex
- int right_downy = left_topy + (int)bboxs[i*6 + 5];
- if (score >= det_Threshold)
- {
- int color_[3] = { (int)(color_map[(categry_id % 256) * 3]),
- (int)(color_map[(categry_id % 256) * 3 + 1]),
- (int)(color_map[(categry_id % 256) * 3 + 2]) };
- QString disscribe_str = makeLabelInfo(label_list[i], categry_id, score);
- int baseline[1];
- auto text_size = getTextSize(disscribe_str.toStdString(), FONT_HERSHEY_SIMPLEX,
- 1.0, 2, baseline);
- int text_left_downx = left_topx; // Small offset adjustment: (int)(text_size.Width/10)
- int text_left_downy = left_topy + text_size.height;
- rectangle(image, Point(left_topx, left_topy),
- Point(right_downx, right_downy),
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- putText(image, disscribe_str.toStdString(), Point(text_left_downx, text_left_downy),
- FONT_HERSHEY_SIMPLEX, 1.0,
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- }
- }
- if (image2 == nullptr)
- {
- image2 = new Mat(image.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(image.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- // Set the end reasoning state
- doing_Infer = false;
- qDebug() << "Finished Det-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- // btnStop->setEnabled(false);
- // btnInfer->setEnabled(true);
- }
- void InferThread::Det_Images()
- {
- doing_Infer = true;
- for (int j = 0; j < images_path.count(); j++)
- {
- if (break_Infer) // Exit continuous detection
- {
- doing_Infer = false;
- break_Infer = false;
- qDebug() << "Det-Infer has Break." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- QString img_file = images_path[j]; // Get image path
- Mat image = imread(img_file.toLocal8Bit().toStdString()); // Help with Chinese paths
- if (image.cols > 512 || image.rows > 512)
- {
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4));
- }
- float bboxs[600];
- int bbox_num[1];
- char labellist[1000];
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing Det-Infer." << "\n";
- det_ModelPredict((const uchar*)image.data, image.cols, image.rows, 3, bboxs, bbox_num, labellist);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Det-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- cvtColor(image, image, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(image.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(image.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- QString labels(labellist);
- QStringList label_list = labels.split(' ');
- for (int i = 0; i < bbox_num[0]; i++)
- {
- int categry_id = (int)bboxs[i*6];
- float score = bboxs[i*6 + 1];
- int left_topx = (int)bboxs[i*6 + 2];
- int left_topy = (int)bboxs[i*6 + 3];
- int right_downx = left_topx + (int)bboxs[i*6 + 4];
- int right_downy = left_topy + (int)bboxs[i*6 + 5];
- if (score >= det_Threshold)
- {
- int color_[3] = { (int)(color_map[(categry_id % 256) * 3]),
- (int)(color_map[(categry_id % 256) * 3 + 1]),
- (int)(color_map[(categry_id % 256) * 3 + 2]) };
- QString disscribe_str = makeLabelInfo(label_list[i], categry_id, score);
- int baseline[1];
- auto text_size = getTextSize(disscribe_str.toStdString(), FONT_HERSHEY_SIMPLEX,
- 1.0, 2, baseline);
- int text_left_downx = left_topx;
- int text_left_downy = left_topy + text_size.height;
- rectangle(image, Point(left_topx, left_topy),
- Point(right_downx, right_downy),
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- putText(image, disscribe_str.toStdString(), Point(text_left_downx, text_left_downy),
- FONT_HERSHEY_SIMPLEX, 1.0,
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- }
- }
- if (image2 == nullptr)
- {
- image2 = new Mat(image.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(image.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- this->msleep(infer_Delay); // Thread sleep wait
- }
- doing_Infer = false;
- qDebug() << "Finished Det-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Det_Video()
- {
- doing_Infer = true;
- VideoCapture cap = VideoCapture(video_path.toLocal8Bit().toStdString());
- if(!cap.isOpened()) return; // Return if the video does not open properly
- Mat frame;
- cap >> frame;
- while(!frame.empty()) // Exit the loop if a frame is empty
- {
- if (frame.cols > 512 || frame.rows > 512)
- {
- float ratio = min(frame.cols, frame.rows) / 512.;
- int new_h = frame.cols / ratio;
- int new_w = frame.rows / ratio;
- cv::resize(frame, frame, cv::Size(new_h/4*4,new_w/4*4));
- }
- if (break_Infer)
- {
- doing_Infer = false;
- break_Infer = false;
- qDebug() << "Det-Infer has Break." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- float bboxs[600];
- int bbox_num[1];
- char labellist[1000];
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing Det-Infer." << "\n";
- det_ModelPredict((const uchar*)frame.data, frame.cols, frame.rows, 3, bboxs, bbox_num, labellist);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Det-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- cvtColor(frame, frame, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(frame.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(frame.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- QString labels(labellist);
- QStringList label_list = labels.split(' ');
- for (int i = 0; i < bbox_num[0]; i++)
- {
- int categry_id = (int)bboxs[i*6];
- float score = bboxs[i*6 + 1];
- int left_topx = (int)bboxs[i*6 + 2];
- int left_topy = (int)bboxs[i*6 + 3];
- int right_downx = left_topx + (int)bboxs[i*6 + 4];
- int right_downy = left_topy + (int)bboxs[i*6 + 5];
- if (score >= det_Threshold)
- {
- int color_[3] = { (int)(color_map[(categry_id % 256) * 3]),
- (int)(color_map[(categry_id % 256) * 3 + 1]),
- (int)(color_map[(categry_id % 256) * 3 + 2]) };
- QString disscribe_str = makeLabelInfo(label_list[i], categry_id, score);
- int baseline[1];
- auto text_size = getTextSize(disscribe_str.toStdString(), FONT_HERSHEY_SIMPLEX,
- 1.0, 2, baseline);
- int text_left_downx = left_topx;
- int text_left_downy = left_topy + text_size.height;
- rectangle(frame, Point(left_topx, left_topy),
- Point(right_downx, right_downy),
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- putText(frame, disscribe_str.toStdString(), Point(text_left_downx, text_left_downy),
- FONT_HERSHEY_SIMPLEX, 1.0,
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- }
- }
- if (image2 == nullptr)
- {
- image2 = new Mat(frame.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(frame.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- cap >> frame;
- }
- doing_Infer = false;
- qDebug() << "Finished Det-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Seg_Image()
- {
- Mat image = imread(image_path.toLocal8Bit().toStdString()); //BGR
- if (image.cols > 512 || image.rows > 512)
- {
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4));
- }
- // Predict output result
- unsigned char out_image[image.cols * image.rows];
- doing_Infer = true;
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing Seg-Infer." << "\n";
- seg_ModelPredict((const uchar*)image.data, image.cols, image.rows, 3, out_image);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Seg-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- // Generate the mask three-channel image
- Mat out3c_image = Mat(image.clone());
- for (int i = 0; i < out3c_image.rows; i++) // height
- {
- for (int j = 0; j < out3c_image.cols; j++) // width
- {
- int indexSrc = i*out3c_image.cols + j;
- unsigned char color_id = (int)out_image[indexSrc] % 256; // Pixel category ID
- if (color_id == 0)
- out3c_image.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
- else
- out3c_image.at<Vec3b>(i, j) = Vec3b(color_map[color_id * 3], color_map[color_id * 3 + 1], color_map[color_id * 3 + 2]);
- }
- }
- cvtColor(image, image, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(image.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(image.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- // merge images
- addWeighted(image, 0.5, out3c_image, 0.5, 0, image);
- if (image2 == nullptr)
- {
- image2 = new Mat(image.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(image.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- doing_Infer = false;
- qDebug() << "Finished Seg-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Seg_Images()
- {
- doing_Infer = true;
- for (int j = 0; j < images_path.count(); j++)
- {
- if (break_Infer)
- {
- doing_Infer = false;
- break_Infer = false;
- qDebug() << "Seg-Infer has Break." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- QString img_file = images_path[j];
- Mat image = imread(img_file.toLocal8Bit().toStdString());
- if (image.cols > 512 || image.rows > 512)
- {
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4));
- }
- unsigned char out_image[image.cols * image.rows];
- memset(out_image, 0, sizeof (out_image));
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing --Seg Infer." << "\n";
- seg_ModelPredict((const uchar*)image.data, image.cols, image.rows, 3, out_image);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Seg-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- Mat out3c_image = Mat(image.clone());
- for (int i = 0; i < out3c_image.rows; i++) // height
- {
- for (int j = 0; j < out3c_image.cols; j++) // width
- {
- int indexSrc = i*out3c_image.cols + j;
- unsigned char color_id = (int)out_image[indexSrc] % 256;
- if (color_id == 0)
- out3c_image.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
- else
- out3c_image.at<Vec3b>(i, j) = Vec3b(color_map[color_id * 3], color_map[color_id * 3 + 1], color_map[color_id * 3 + 2]);
- }
- }
- cvtColor(image, image, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(image.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(image.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- addWeighted(image, 0.5, out3c_image, 0.5, 0, image);
- if (image2 == nullptr)
- {
- image2 = new Mat(image.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(image.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- this->msleep(infer_Delay);
- }
- doing_Infer = false;
- qDebug() << "Finished Seg-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Seg_Video()
- {
- doing_Infer = true;
- VideoCapture cap = VideoCapture(video_path.toLocal8Bit().toStdString());
- if(!cap.isOpened()) return;
- Mat frame;
- cap >> frame;
- while(!frame.empty())
- {
- if (frame.cols > 512 || frame.rows > 512)
- {
- float ratio = min(frame.cols, frame.rows) / 512.;
- int new_h = frame.cols / ratio;
- int new_w = frame.rows / ratio;
- cv::resize(frame, frame, cv::Size(new_h/4*4,new_w/4*4));
- }
- if (break_Infer)
- {
- doing_Infer = false;
- break_Infer = false;
- qDebug() << "Seg-Infer has Break." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- unsigned char out_image[frame.cols * frame.rows];
- memset(out_image, 0, sizeof (out_image));
- try {
- clock_t start_infer_time = clock();
-
- qDebug() << "Doing Seg-Infer." << "\n";
- seg_ModelPredict((const uchar*)frame.data, frame.cols, frame.rows, 3, out_image);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Seg-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
-
- return;
- }
- Mat out3c_image = Mat(frame.clone());
- for (int i = 0; i < out3c_image.rows; i++) // height
- {
- for (int j = 0; j < out3c_image.cols; j++) // width
- {
- int indexSrc = i*out3c_image.cols + j;
- unsigned char color_id = (int)out_image[indexSrc] % 256;
- if (color_id == 0)
- out3c_image.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
- else
- out3c_image.at<Vec3b>(i, j) = Vec3b(color_map[color_id * 3], color_map[color_id * 3 + 1], color_map[color_id * 3 + 2]);
- }
- }
- cvtColor(frame, frame, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(frame.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(frame.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- addWeighted(frame, 0.5, out3c_image, 0.5, 0, frame);
- if (image2 == nullptr)
- {
- image2 = new Mat(frame.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(frame.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- cap >> frame;
- }
- doing_Infer = false;
- qDebug() << "Finished Seg-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Cls_Image()
- {
- Mat image = imread(image_path.toLocal8Bit().toStdString()); //BGR
- if (image.cols > 512 || image.rows > 512)
- {
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4));
- }
- // Predict output result
- float pre_score[1];
- int pre_category_id[1];
- char pre_category[200];
- doing_Infer = true;
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing Clas-Infer." << "\n";
- cls_ModelPredict((const uchar*)image.data, image.cols, image.rows, 3, pre_score, pre_category, pre_category_id);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Clas-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- cvtColor(image, image, COLOR_BGR2RGB);
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4));
- if (image1 == nullptr)
- {
- image1 = new Mat(image.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(image.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- int color_[3] = { (int)(color_map[(pre_category_id[0] % 256) * 3]),
- (int)(color_map[(pre_category_id[0] % 256) * 3 + 1]),
- (int)(color_map[(pre_category_id[0] % 256) * 3 + 2]) };
- QString disscribe_str = makeLabelInfo(QString(pre_category), pre_category_id[0], pre_score[0]);
- int baseline[1];
- auto text_size = getTextSize(disscribe_str.toStdString(), FONT_HERSHEY_SIMPLEX,
- 1.0, 2, baseline);
- int text_left_downx = 0;
- int text_left_downy = 0 + text_size.height;
- putText(image, disscribe_str.toStdString(), Point(text_left_downx, text_left_downy),
- FONT_HERSHEY_SIMPLEX, 1.0,
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- if (image2 == nullptr)
- {
- image2 = new Mat(image.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(image.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- doing_Infer = false;
- qDebug() << "Finished Clas-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Cls_Images()
- {
- doing_Infer = true;
- for (int j = 0; j < images_path.count(); j++)
- {
- if (break_Infer)
- {
- doing_Infer = false;
- break_Infer = false;
- qDebug() << "Clas-Infer has Break." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- QString img_file = images_path[j];
- Mat image = imread(img_file.toLocal8Bit().toStdString());
- if (image.cols > 512 || image.rows > 512)
- {
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4));
- }
- float pre_score[1];
- int pre_category_id[1];
- char pre_category[200];
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing Clas-Infer." << "\n";
- cls_ModelPredict((const uchar*)image.data, image.cols, image.rows, 3, pre_score, pre_category, pre_category_id);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Clas-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- cvtColor(image, image, COLOR_BGR2RGB);
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4));
- if (image1 == nullptr)
- {
- image1 = new Mat(image.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(image.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- int color_[3] = { (int)(color_map[(pre_category_id[0] % 256) * 3]),
- (int)(color_map[(pre_category_id[0] % 256) * 3 + 1]),
- (int)(color_map[(pre_category_id[0] % 256) * 3 + 2]) };
- QString disscribe_str = makeLabelInfo(QString(pre_category), pre_category_id[0], pre_score[0]);
- int baseline[1];
- auto text_size = getTextSize(disscribe_str.toStdString(), FONT_HERSHEY_SIMPLEX,
- 1.0, 2, baseline);
- int text_left_downx = 0;
- int text_left_downy = 0 + text_size.height;
- putText(image, disscribe_str.toStdString(), Point(text_left_downx, text_left_downy),
- FONT_HERSHEY_SIMPLEX, 1.0,
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- if (image2 == nullptr)
- {
- image2 = new Mat(image.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(image.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- this->msleep(infer_Delay);
- }
- doing_Infer = false;
- qDebug() << "Finished Clas-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Cls_Video()
- {
- doing_Infer = true;
- VideoCapture cap = VideoCapture(video_path.toLocal8Bit().toStdString());
- if(!cap.isOpened()) return;
- Mat frame;
- cap >> frame;
- while(!frame.empty())
- {
- if (frame.cols > 512 || frame.rows > 512)
- {
- float ratio = min(frame.cols, frame.rows) / 512.;
- int new_h = frame.cols / ratio;
- int new_w = frame.rows / ratio;
- cv::resize(frame, frame, cv::Size(new_h/4*4,new_w/4*4));
- }
- if (break_Infer)
- {
- doing_Infer = false;
- break_Infer = false;
- qDebug() << "Clas-Infer has Break." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- float pre_score[1];
- int pre_category_id[1];
- char pre_category[200];
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing Clas-Infer." << "\n";
- cls_ModelPredict((const uchar*)frame.data, frame.cols, frame.rows, 3, pre_score, pre_category, pre_category_id);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Clas-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- cvtColor(frame, frame, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(frame.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(frame.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- int color_[3] = { (int)(color_map[(pre_category_id[0] % 256) * 3]),
- (int)(color_map[(pre_category_id[0] % 256) * 3 + 1]),
- (int)(color_map[(pre_category_id[0] % 256) * 3 + 2]) };
- QString disscribe_str = makeLabelInfo(QString(pre_category), pre_category_id[0], pre_score[0]);
- int baseline[1];
- auto text_size = getTextSize(disscribe_str.toStdString(), FONT_HERSHEY_SIMPLEX,
- 1.0, 2, baseline);
- int text_left_downx = 0;
- int text_left_downy = 0 + text_size.height;
- putText(frame, disscribe_str.toStdString(), Point(text_left_downx, text_left_downy),
- FONT_HERSHEY_SIMPLEX, 1.0,
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- if (image2 == nullptr)
- {
- image2 = new Mat(frame.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(frame.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- cap >> frame;
- }
- doing_Infer = false;
- qDebug() << "Finished Clas-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Mask_Image()
- {
- Mat image = imread(image_path.toLocal8Bit().toStdString()); //BGR
- if (image.cols > 512 || image.rows > 512)
- {
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4));
- }
- // Predict output result
- float bboxs[600];
- int bbox_num[1];
- char labellist[1000];
- unsigned char out_image[image.cols * image.rows];
- doing_Infer = true;
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing Mask-Infer." << "\n";
- mask_ModelPredict((const uchar*)image.data, image.cols, image.rows, 3, bboxs, out_image, bbox_num, labellist);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Mask-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- Mat out3c_image = Mat(image.clone());
- for (int i = 0; i < out3c_image.rows; i++) // height
- {
- for (int j = 0; j < out3c_image.cols; j++) // width
- {
- int indexSrc = i*out3c_image.cols + j;
- unsigned char color_id = (int)out_image[indexSrc] % 256;
- if (color_id == 0)
- out3c_image.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
- else
- out3c_image.at<Vec3b>(i, j) = Vec3b(color_map[color_id * 3], color_map[color_id * 3 + 1], color_map[color_id * 3 + 2]);
- }
- }
- cvtColor(image, image, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(image.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(image.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- addWeighted(image, 0.5, out3c_image, 0.5, 0, image);
- QString labels(labellist);
- QStringList label_list = labels.split(' '); // Get Label
- for (int i = 0; i < bbox_num[0]; i++)
- {
- int categry_id = (int)bboxs[i*6];
- float score = bboxs[i*6 + 1];
- int left_topx = (int)bboxs[i*6 + 2];
- int left_topy = (int)bboxs[i*6 + 3];
- int right_downx = left_topx + (int)bboxs[i*6 + 4];
- int right_downy = left_topy + (int)bboxs[i*6 + 5];
- if (score >= det_Threshold)
- {
- int color_[3] = { (int)(color_map[(categry_id % 256) * 3]),
- (int)(color_map[(categry_id % 256) * 3 + 1]),
- (int)(color_map[(categry_id % 256) * 3 + 2]) };
- QString disscribe_str = makeLabelInfo(label_list[i], categry_id, score);
- int baseline[1];
- auto text_size = getTextSize(disscribe_str.toStdString(), FONT_HERSHEY_SIMPLEX,
- 1.0, 2, baseline);
- int text_left_downx = left_topx;
- int text_left_downy = left_topy + text_size.height;
- rectangle(image, Point(left_topx, left_topy),
- Point(right_downx, right_downy),
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- putText(image, disscribe_str.toStdString(), Point(text_left_downx, text_left_downy),
- FONT_HERSHEY_SIMPLEX, 1.0,
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- }
- }
- if (image2 == nullptr)
- {
- image2 = new Mat(image.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(image.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- doing_Infer = false;
- qDebug() << "Finished Mask-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Mask_Images()
- {
- doing_Infer = true;
- for (int j = 0; j < images_path.count(); j++)
- {
- if (break_Infer)
- {
- doing_Infer = false;
- break_Infer = false;
- qDebug() << "Mask-Infer has Break." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- QString img_file = images_path[j];
- Mat image = imread(img_file.toLocal8Bit().toStdString());
- if (image.cols > 512 || image.rows > 512)
- {
- float ratio = min(image.cols, image.rows) / 512.;
- int new_h = image.cols / ratio;
- int new_w = image.rows / ratio;
- cv::resize(image, image, cv::Size(new_h/4*4,new_w/4*4));
- }
- float bboxs[600];
- int bbox_num[1];
- char labellist[1000];
- unsigned char out_image[image.cols * image.rows];
- memset(out_image, 0, sizeof (out_image));
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing Mask-Infer." << "\n";
- mask_ModelPredict((const uchar*)image.data, image.cols, image.rows, 3, bboxs, out_image, bbox_num, labellist);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Mask-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- Mat out3c_image = Mat(image.clone());
- for (int i = 0; i < out3c_image.rows; i++) // height
- {
- for (int j = 0; j < out3c_image.cols; j++) // width
- {
- int indexSrc = i*out3c_image.cols + j;
- unsigned char color_id = (int)out_image[indexSrc] % 256;
- if (color_id == 0)
- out3c_image.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
- else
- out3c_image.at<Vec3b>(i, j) = Vec3b(color_map[color_id * 3], color_map[color_id * 3 + 1], color_map[color_id * 3 + 2]);
- }
- }
- cvtColor(image, image, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(image.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(image.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- addWeighted(image, 0.5, out3c_image, 0.5, 0, image);
- QString labels(labellist);
- QStringList label_list = labels.split(' '); // 获取label
- for (int i = 0; i < bbox_num[0]; i++)
- {
- int categry_id = (int)bboxs[i*6];
- float score = bboxs[i*6 + 1];
- int left_topx = (int)bboxs[i*6 + 2];
- int left_topy = (int)bboxs[i*6 + 3];
- int right_downx = left_topx + (int)bboxs[i*6 + 4];
- int right_downy = left_topy + (int)bboxs[i*6 + 5];
- if (score >= det_Threshold)
- {
- int color_[3] = { (int)(color_map[(categry_id % 256) * 3]),
- (int)(color_map[(categry_id % 256) * 3 + 1]),
- (int)(color_map[(categry_id % 256) * 3 + 2]) };
- QString disscribe_str = makeLabelInfo(label_list[i], categry_id, score);
- int baseline[1];
- auto text_size = getTextSize(disscribe_str.toStdString(), FONT_HERSHEY_SIMPLEX,
- 1.0, 2, baseline);
- int text_left_downx = left_topx;
- int text_left_downy = left_topy + text_size.height;
- rectangle(image, Point(left_topx, left_topy),
- Point(right_downx, right_downy),
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- putText(image, disscribe_str.toStdString(), Point(text_left_downx, text_left_downy),
- FONT_HERSHEY_SIMPLEX, 1.0,
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- }
- }
- if (image2 == nullptr)
- {
- image2 = new Mat(image.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(image.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- this->msleep(infer_Delay);
- }
- doing_Infer = false;
- qDebug() << "Finished Mask-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
- void InferThread::Mask_Video()
- {
- doing_Infer = true;
- VideoCapture cap = VideoCapture(video_path.toLocal8Bit().toStdString());
- if(!cap.isOpened()) return;
- Mat frame;
- cap >> frame;
- while(!frame.empty())
- {
- if (frame.cols > 512 || frame.rows > 512)
- {
- float ratio = min(frame.cols, frame.rows) / 512.;
- int new_h = frame.cols / ratio;
- int new_w = frame.rows / ratio;
- cv::resize(frame, frame, cv::Size(new_h/4*4,new_w/4*4));
- }
- if (break_Infer)
- {
- doing_Infer = false;
- break_Infer = false;
- qDebug() << "Mask-Infer has Break." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- float bboxs[600];
- int bbox_num[1];
- char labellist[1000];
- unsigned char out_image[frame.cols * frame.rows];
- memset(out_image, 0, sizeof (out_image));
- try {
- clock_t start_infer_time = clock();
- qDebug() << "Doing Mask-Infer." << "\n";
- mask_ModelPredict((const uchar*)frame.data, frame.cols, frame.rows, 3, bboxs, out_image, bbox_num, labellist);
- double cost_time = 1000 * (clock() - start_infer_time) / (double)CLOCKS_PER_SEC;
- emit SetCostTime(cost_time);
- } catch (QException &e) {
- doing_Infer = false;
- qDebug() << "Finished Mask-Infer, but it is raise a exception." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- return;
- }
- Mat out3c_image = Mat(frame.clone());
- for (int i = 0; i < out3c_image.rows; i++) // height
- {
- for (int j = 0; j < out3c_image.cols; j++) // width
- {
- int indexSrc = i*out3c_image.cols + j;
- unsigned char color_id = (int)out_image[indexSrc] % 256;
- if (color_id == 0)
- out3c_image.at<Vec3b>(i, j) = Vec3b(0, 0, 0);
- else
- out3c_image.at<Vec3b>(i, j) = Vec3b(color_map[color_id * 3], color_map[color_id * 3 + 1], color_map[color_id * 3 + 2]);
- }
- }
- cvtColor(frame, frame, COLOR_BGR2RGB);
- if (image1 == nullptr)
- {
- image1 = new Mat(frame.clone());
- }
- else
- {
- delete image1;
- image1 = new Mat(frame.clone());
- }
- if (label1_image == nullptr)
- {
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- else
- {
- delete label1_image;
- label1_image = new QImage((const uchar*)image1->data, image1->cols, image1->rows,
- image1->step, QImage::Format_RGB888);
- }
- addWeighted(frame, 0.5, out3c_image, 0.5, 0, frame);
- QString labels(labellist);
- QStringList label_list = labels.split(' ');
- for (int i = 0; i < bbox_num[0]; i++)
- {
- int categry_id = (int)bboxs[i*6];
- float score = bboxs[i*6 + 1];
- int left_topx = (int)bboxs[i*6 + 2];
- int left_topy = (int)bboxs[i*6 + 3];
- int right_downx = left_topx + (int)bboxs[i*6 + 4];
- int right_downy = left_topy + (int)bboxs[i*6 + 5];
- if (score >= det_Threshold)
- {
- int color_[3] = { (int)(color_map[(categry_id % 256) * 3]),
- (int)(color_map[(categry_id % 256) * 3 + 1]),
- (int)(color_map[(categry_id % 256) * 3 + 2]) };
- QString disscribe_str = makeLabelInfo(label_list[i], categry_id, score);
- int baseline[1];
- auto text_size = getTextSize(disscribe_str.toStdString(), FONT_HERSHEY_SIMPLEX,
- 1.0, 2, baseline);
- int text_left_downx = left_topx;
- int text_left_downy = left_topy + text_size.height;
- rectangle(frame, Point(left_topx, left_topy),
- Point(right_downx, right_downy),
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- putText(frame, disscribe_str.toStdString(), Point(text_left_downx, text_left_downy),
- FONT_HERSHEY_SIMPLEX, 1.0,
- Scalar(color_[0], color_[1], color_[2]), 2, LINE_8);
- }
- }
- if (image2 == nullptr)
- {
- image2 = new Mat(frame.clone());
- }
- else
- {
- delete image2;
- image2 = new Mat(frame.clone());
- }
- if (label2_image == nullptr)
- {
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- else
- {
- delete label2_image;
- label2_image = new QImage((const uchar*)image2->data, image2->cols, image2->rows,
- image2->step, QImage::Format_RGB888);
- }
- emit InferFinished(label1_image, label2_image);
- cap >> frame;
- }
- doing_Infer = false;
- qDebug() << "Finished Mask-Infer." << "\n";
- emit SetState_Btn_StopAndInfer(false, true); // first is stop, second is infer
- }
|