张洋 před 2 týdny
rodič
revize
7a0139f791

+ 1 - 1
bin/Win32/Debug/zhipuzi_pos_windows/skin/setting_ai_shibie.xml

@@ -7,7 +7,7 @@
 	
 	<Control height="1" bkcolor="#FFEAEAEA" padding="0,20,0,0"></Control>
 	
-	<HorizontalLayout height="500" padding="0,20,0,0">
+	<HorizontalLayout name="setting_video_layout" height="500" padding="0,20,0,0">
 		<Label text="摄像头识别区域设置" width="260" height="30"/>
 		<VerticalLayout width="600" height="450" padding="10,0,10,0">
 			<Control name="image_video" float="true" pos="0,0,400,300"></Control>

+ 4 - 1
zhipuzi_pos_windows/page/CAIxuexiPageUI.cpp

@@ -652,7 +652,7 @@ void CAIxuexiPageUI::DoXuexi()
 	//走到这里已经是裁减过的图片了,直接开始缩放和填充
 	CVideoCapture::GetInstance()->HandleResizeAndPaddingFrame(img, img);	
 
-	//第二步把这个图片的特征向量提取出来,保存到数据库里,关联到当前选中的商品上
+	//第二步把这个图片的特征向量提取出来,保存到数据库里,关联到当前选中的商品上(提取的是填充过的图片,与yolo训练的处理逻辑一致)
 	std::cout << "开始提取图库图片特征..." << std::endl;
 	std::vector<float> features = YoloFeatureManager::GetInstance()->extractFeatures(img);
 	if (!features.empty())
@@ -710,5 +710,8 @@ std::wstring CAIxuexiPageUI::DoCaiji()
 	//这里存本地的文件,存裁减以后的原图,不进行缩放和填充,用于生成训练集数据,后续训练的时候会进行缩放和填充
 	cv::imwrite(CLewaimaiString::UnicodeToUTF8(file_save_path), img);
 
+	//测试一下AI识别【测试用】
+	//CDiandanAIShibieWorker::GetInstance()->AddAIShibieTask();
+
 	return file_save_path;
 }

+ 23 - 1
zhipuzi_pos_windows/page/CSettingPageUI.cpp

@@ -951,13 +951,18 @@ void CSettingPageUI::InitControl()
 
 	//初始化AI识别的设置
 	box = static_cast<CCheckBoxUI *>(this->FindSubControl(_T("setting_is_ai_recognition_open")));
+	CHorizontalLayoutUI* videoLayout = static_cast<CHorizontalLayoutUI*>(this->FindSubControl(_T("setting_video_layout")));
 	if (CSetting::GetInstance()->GetParam("setting_is_ai_recognition_open") == "1")
 	{
 		box->Selected(true, false);
+
+		videoLayout->SetVisible(true);
 	}
 	else
 	{
 		box->Selected(false, false);
+
+		videoLayout->SetVisible(false);
 	}
 
 	//初始化展示设置
@@ -1607,18 +1612,20 @@ void CSettingPageUI::HandleClickMsg(TNotifyUI& msg)
 	else if (name == _T("setting_is_ai_recognition_open"))
 	{
 		CCheckBoxUI * box = static_cast<CCheckBoxUI *>(this->FindSubControl(_T("setting_is_ai_recognition_open")));
-
+		CHorizontalLayoutUI* videoLayout = static_cast<CHorizontalLayoutUI*>(this->FindSubControl(_T("setting_video_layout")));
 		if (box->IsSelected())
 		{
 			CSetting::GetInstance()->SetParam("setting_is_ai_recognition_open", "0");
 
 			CDiandanAIShibieWorker::GetInstance()->StopAIShibie();
+			videoLayout->SetVisible(false);
 		}
 		else
 		{
 			CSetting::GetInstance()->SetParam("setting_is_ai_recognition_open", "1");
 
 			CDiandanAIShibieWorker::GetInstance()->StartAIShibie();
+			videoLayout->SetVisible(true);
 		}
 	}
 	else if (name == _T("setting_logout"))
@@ -3476,12 +3483,27 @@ void CSettingPageUI::HandleUpdateVideo()
 			cvtColor(img, img, cv::COLOR_GRAY2BGR);
 		}
 
+		CCheckBoxUI* box = static_cast<CCheckBoxUI*>(this->FindSubControl(_T("setting_is_ai_recognition_open")));
+		if (box->IsSelected() == false)
+		{
+			//还没开启AI识别,所以界面上image控件的大小还没计算出来,等待一会再重新读取
+			Sleep(20);
+			continue;
+		}
+
 		//缩放尺寸,适合在界面上展示,过大过小都不好看,这个尺寸是根据界面上image控件的大小来定的,可以根据实际情况调整(摄像头拍摄出来的,默认为800*600)
 		CControlUI* pImage = static_cast<CControlUI*>(this->FindSubControl(_T("image_video")));
 		RECT imageRect = pImage->GetPos();
 		int imageWidth = imageRect.right - imageRect.left;
 		int imageHeight = imageRect.bottom - imageRect.top;
 
+		if (imageWidth <= 0 || imageHeight <= 0)
+		{
+			//尺寸错误,等待一会再重新读取
+			Sleep(1000);
+			continue;
+		}
+
 		cv::resize(img, img, cv::Size(imageWidth, imageHeight), 0, 0, cv::INTER_LINEAR);
 
 		// 创建或更新位图

binární
zhipuzi_pos_windows/resource/skin.zip


+ 14 - 0
zhipuzi_pos_windows/worker/CDiandanAIShibieWorker.cpp

@@ -78,6 +78,20 @@ void CDiandanAIShibieWorker::DoAIShibie()
 		CVideoCapture::GetInstance()->HandleCutFrame(image, image);
 		CVideoCapture::GetInstance()->HandleResizeAndPaddingFrame(image, image);
 
+		//把用于出别的图片保存在本地,调试用
+		/*
+		std::wstring save_path = CSystem::GetTmpDir() + L"\\ai_xuexi_image";
+		if (!CSystem::IsPathExist(save_path))
+		{
+			CSystem::CreateMultiLevel(CLewaimaiString::UnicodeToUTF8(save_path));
+		}
+
+		std::string filename = CLewaimaiString::generateRandomStr(32);
+		std::wstring file_save_path = save_path + L"\\" + CLewaimaiString::UTF8ToUnicode(filename) + L".jpg";
+
+		cv::imwrite(CLewaimaiString::UnicodeToUTF8(file_save_path), image);
+		*/
+
 		//裁剪完,填充完,才开始进行推理计算
 		m_ai_shibie_foodname = YoloFeatureManager::GetInstance()->Class(image);
 		if (m_ai_shibie_foodname != "Unknown")