You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			218 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
			
		
		
	
	
			218 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			C++
		
	
| #include "CigaretteSingle.h"
 | |
| #include <QFile>
 | |
| #include <QMessageBox>
 | |
| #include <common.h>
 | |
| 
 | |
| SyncQueue<std::pair<std::string, cv::Mat> >* g_save_queue;
 | |
| SyncQueue<cv::Mat>* g_image_queue;
 | |
| ASyncQueue<bool>* g_result_queue;
 | |
| 
 | |
| CigaretteSingle::CigaretteSingle(QWidget *parent)
 | |
|     : QMainWindow(parent)
 | |
|     , ui(new Ui::CigaretteSingleClass())
 | |
| {
 | |
|     ui->setupUi(this);
 | |
|     ui->centralWidget->setStyleSheet("background-color : #1F2026;");
 | |
|     QFile qrcfile;
 | |
|     //设置登录窗口和添加窗口的样式
 | |
|     qrcfile.setFileName(":/CigaretteSingle/darkblack.css");
 | |
|     qrcfile.open(QIODevice::ReadOnly);
 | |
|     QString strQss = qrcfile.readAll();
 | |
|     this->setStyleSheet(strQss); 
 | |
|     
 | |
| 
 | |
|     g_save_queue = new SyncQueue<std::pair<std::string, cv::Mat> >(Queue_Size);
 | |
|     g_save_queue->name = "save queue";
 | |
|     g_image_queue = new SyncQueue<cv::Mat>(Queue_Size);
 | |
|     g_image_queue->name = format("image");
 | |
|     g_result_queue = new ASyncQueue<bool>(Queue_Size);
 | |
|     g_result_queue->name = format("result");
 | |
| 
 | |
|     saveThread.init(g_save_queue);
 | |
|     saveThread.start_work();
 | |
| 
 | |
|     g_ts_start = QDateTime::currentDateTime();		//系统启动时间
 | |
|     //每秒任务定时器
 | |
|     m_pTimer = new QTimer(this);
 | |
|     connect(m_pTimer, SIGNAL(timeout()), this, SLOT(event_per_second()));
 | |
|     m_pTimer->start(1000);
 | |
| 
 | |
|     connect(ui->textBrowser, SIGNAL(cursorPositionChanged()), this, SLOT(autoScroll()));
 | |
| 
 | |
|     m_alg_ptr = new Alg;
 | |
|     int hik_cnt = 0;
 | |
|     hik_cnt = HIKCamera::Enumerate();
 | |
|     if (hik_cnt)
 | |
|     {
 | |
|         HIKCamera::HikController = HIKCamera::InitHIKController(0);
 | |
|         HikControllerPtr = HIKCamera::HikController;
 | |
|         HikControllerPtr->p_image_queue = g_image_queue;
 | |
|         HikControllerPtr->p_result_queue = g_result_queue;
 | |
|         HikControllerPtr->OpenCamera();
 | |
|     }
 | |
| 
 | |
|     work_thread.p_image_queue = g_image_queue;
 | |
|     work_thread.p_result_queue = g_result_queue;
 | |
|     work_thread.p_save_queue = g_save_queue;
 | |
|     work_thread.m_alg_ptr = m_alg_ptr;
 | |
|     work_thread.init();
 | |
| 
 | |
|     connect(&work_thread, SIGNAL(display_image(cv::Mat)), this, SLOT(DisplayImage(cv::Mat)));
 | |
|     work_thread.start_work();
 | |
| }
 | |
| 
 | |
| CigaretteSingle::~CigaretteSingle()
 | |
| {
 | |
|     delete g_save_queue;
 | |
|     delete g_image_queue;
 | |
|     delete g_result_queue;
 | |
|     delete ui;
 | |
| }
 | |
| 
 | |
| void CigaretteSingle::DisplayImage(cv::Mat m)
 | |
| {
 | |
|     // //将图像大小缩放为显示窗口大小
 | |
|     cv::Size display_size = cv::Size(ui->image_label->width(), ui->image_label->height());
 | |
|     cv::resize(m, m, display_size);
 | |
|     QImage tempImage = cvMatToQImage(m);
 | |
|     ui->image_label->setPixmap(QPixmap::fromImage(tempImage));
 | |
|     
 | |
| }
 | |
| 
 | |
| //定时任务,每秒运行一次
 | |
| void CigaretteSingle::event_per_second()
 | |
| {
 | |
|     static int weight_per_minute_mat[10] = {0};
 | |
|     static INT16 last_weight = 0;
 | |
|     QDateTime ts_start = QDateTime::currentDateTime();
 | |
|     QDateTime local(ts_start);
 | |
|     QString localTime = local.toString("yyyy-MM-dd hh:mm:ss");
 | |
|     //ui->label_cur_time_val->setText(localTime);
 | |
| 
 | |
|     qint64 intervalTime = g_ts_start.secsTo(ts_start);
 | |
|     int days = (intervalTime) / (24 * 3600);
 | |
|     int hours = (intervalTime) % (24 * 3600) / 3600;
 | |
|     int minutes = (intervalTime) % 3600 / 60;
 | |
|     int second = (intervalTime) % 60;
 | |
| 
 | |
|     QString run_stat = SecondToQStrTime(intervalTime);
 | |
|     ui->label_run_time_val->setText(run_stat);
 | |
| }
 | |
| 
 | |
| void CigaretteSingle::on_pushButton_mtest_released()
 | |
| {
 | |
|     QString srcDirPath = QFileDialog::getExistingDirectory(this, "choose src Directory", "./");
 | |
| 
 | |
|     if (srcDirPath.isEmpty())
 | |
|     {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     vector<string> files;
 | |
|     qDebug() << "srcDirPath=" << srcDirPath;
 | |
|     srcDirPath += "/";
 | |
|     //获取该路径下的所有文件
 | |
|     getFiles(srcDirPath.toStdString() + "*.jpg", files);
 | |
|     for (int i = 0; i < files.size(); i++)
 | |
|     {
 | |
|         //输入图像
 | |
|         std::cout << "open file------ " << files[i] << std::endl;
 | |
|         cv::Mat imagein = cv::imread(srcDirPath.toStdString() + files[i], cv::IMREAD_COLOR);
 | |
|         if (imagein.data)
 | |
|         {
 | |
|             cv::cvtColor(imagein, imagein, cv::COLOR_BGR2GRAY);
 | |
|             g_image_queue->put(imagein.clone());
 | |
|             Sleep(500);
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| //cv::Mat image;
 | |
| //cv::Mat imageCopy; //绘制矩形框时用来拷贝原图的图像
 | |
| bool leftButtonDownFlag = false; //左键单击后视频暂停播放的标志位
 | |
| cv::Point originalPoint; //矩形框起点
 | |
| cv::Point processPoint; //矩形框终点
 | |
| std::vector<cv::Rect> RectVet;
 | |
| void onMouse(int event, int x, int y, int flags, void* ustc); //鼠标回调函数
 | |
| 
 | |
| void CigaretteSingle::on_pushButton_selectregion_released()
 | |
| {
 | |
|     QString srcDirPath = QString::fromStdString(SelectDirIFD());
 | |
| 	Alg m_alg;
 | |
|     vector<string> files;
 | |
|     qDebug() << "srcDirPath=" << srcDirPath;
 | |
|     srcDirPath += "/";
 | |
|     //获取该路径下的所有文件
 | |
|     getFiles(srcDirPath.toStdString() + "*.jpg", files);
 | |
|     if (files.size() == 0)
 | |
|     {
 | |
|         QMessageBox::StandardButton result = QMessageBox::information(NULL, QStringLiteral("提示"), QStringLiteral("没有找到图片"));
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     cv::namedWindow("Image");
 | |
|     cv::setMouseCallback("Image", onMouse);
 | |
|     for (int index = 0; index < files.size(); index++)
 | |
|     {
 | |
|         //输入图像
 | |
|         //std::cout << "open file------ " << files[index] << std::endl;
 | |
|         cv::Mat imagein = cv::imread(srcDirPath.toStdString() + files[index], cv::IMREAD_COLOR);
 | |
| 		cv::cvtColor(imagein, imagein, cv::COLOR_BGR2GRAY);
 | |
|         if (!imagein.data)
 | |
|         {
 | |
|             break;
 | |
|         }
 | |
|         //1. 起点等于终点
 | |
|         //2. 左键按下且未抬起
 | |
|         if ((originalPoint != processPoint) && (leftButtonDownFlag == true))
 | |
|         {
 | |
|             rectangle(imagein, originalPoint, processPoint, cv::Scalar(255, 0, 0), 2);
 | |
|         }
 | |
| 		if (RectVet.size())
 | |
| 		{
 | |
| 			for (int i = 0; i < RectVet.size(); i++)
 | |
| 			{
 | |
| 				cv::Mat input = imagein(RectVet[i]).clone();
 | |
| 				cv::Mat output;
 | |
| 				m_alg.process_bool(input, output);
 | |
| 				cv::putText(imagein, to_string (i), RectVet[i].tl(),CV_FONT_HERSHEY_DUPLEX, 1, cv::Scalar(0, 0, 255));
 | |
| 				rectangle(imagein, RectVet[i], cv::Scalar(0, 0, 255), 2);
 | |
| 			}
 | |
| 		}
 | |
|         imshow("Image", imagein);
 | |
|         //cv::cvtColor(imagein, imagein, cv::COLOR_BGR2GRAY);
 | |
|         //g_image_queue->put(imagein.clone());
 | |
|         //Sleep(500);
 | |
| 		int k = cv::waitKeyEx(1);
 | |
| 		if (k == 27)break;//ESC键
 | |
| 		else if ((k == 3014656) && (RectVet.size() != 0))RectVet.pop_back();//DELETE键
 | |
| 
 | |
|         if (index == files.size() - 1)index = 0;
 | |
|         QCoreApplication::processEvents();
 | |
|     }
 | |
|     cv::imshow("Image", cv::Mat::zeros(cv::Size(1, 1), CV_8UC1));
 | |
|     cv::destroyWindow("Image");
 | |
| }
 | |
| 
 | |
| //鼠标回调函数  
 | |
| void onMouse(int event, int x, int y, int flags, void* ustc)
 | |
| {
 | |
|     if (event == CV_EVENT_LBUTTONDOWN)
 | |
|     {
 | |
|         leftButtonDownFlag = true; //标志位
 | |
|         originalPoint = cv::Point(x, y);  //设置左键按下点的矩形起点
 | |
|         processPoint = originalPoint;
 | |
|     }
 | |
|     if (event == CV_EVENT_MOUSEMOVE && leftButtonDownFlag)
 | |
|     {
 | |
|         processPoint = cv::Point(x, y);
 | |
|     }
 | |
|     if (event == CV_EVENT_LBUTTONUP)
 | |
|     {
 | |
|         leftButtonDownFlag = false;
 | |
| 		RectVet.push_back(cv::Rect(originalPoint, processPoint));
 | |
|         //cv::Mat rectImage = image(cv::Rect(originalPoint, processPoint)); //子图像显示
 | |
|         //cv::imshow("Sub Image", rectImage);
 | |
|     }
 | |
| } |