📄 searchobjectdlg.cpp
字号:
// SearchObjectDlg.cpp : implementation file
//
#include "stdafx.h"
#include "IRExpPlatform.h"
#include "SearchObjectDlg.h"
#include "VideoConfigureDlg.h"
#include "ThresholdSet.h"
#include "ParameterSet.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSearchObjectDlg dialog
CSearchObjectDlg::CSearchObjectDlg(CWnd* pParent /*=NULL*/)
: CDialog(CSearchObjectDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CSearchObjectDlg)
m_strPos = _T("");
//}}AFX_DATA_INIT
}
void CSearchObjectDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSearchObjectDlg)
DDX_Control(pDX, IDC_COMBOOBSTACLE, m_ctrlComboObstacleColor);
DDX_Control(pDX, IDC_COMBOOBJECT, m_ctrlComboObjectColor);
DDX_Text(pDX, IDC_EDITROBOTPOS, m_strPos);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSearchObjectDlg, CDialog)
//{{AFX_MSG_MAP(CSearchObjectDlg)
ON_WM_MOUSEMOVE()
ON_BN_CLICKED(IDC_CLOSEINSEARCHDLG, OnCloseinsearchdlg)
// ON_BN_CLICKED(IDC_BACKINSEARCHDLG, OnBackinsearchdlg)
ON_BN_CLICKED(IDC_STARTINSEARCHOBJECT, OnStartinsearchobject)
ON_BN_CLICKED(IDC_CONFIGVIDEOINSEARCHDLG, OnConfigvideoinsearchdlg)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_CARSTOPINSEARCHOBJECT, OnCarstopinsearchobject)
ON_CBN_CLOSEUP(IDC_COMBOOBJECT, OnCloseupComboobject)
ON_CBN_CLOSEUP(IDC_COMBOOBSTACLE, OnCloseupComboobstacle)
ON_BN_CLICKED(IDC_OPENCOLORVIDEO, OnOpencolorvideo)
ON_BN_CLICKED(IDC_CLOSECOLORVIDEO, OnClosecolorvideo)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_THRESHOLDSETINSEARCHOBJECTDLG, OnThresholdsetinsearchobjectdlg)
ON_BN_CLICKED(IDC_PARAMETERSETINSEARCHOBJECTDLG, OnParametersetinsearchobjectdlg)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSearchObjectDlg message handlers
void CSearchObjectDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
//注释请参考void CWalkWhiteDlg::OnLButtonDown(UINT nFlags, CPoint point)
CWnd* pWnd= GetDlgItem(IDC_AFTERDEALINSEARCHDLG);
CDC* pDC = pWnd->GetDC();
CPoint selectPoint;
selectPoint.x = point.x;
selectPoint.y = point.y;
MapWindowPoints(pWnd, &selectPoint, 1);
ClientToScreen(&point);
CRect imageRect;
pWnd->GetWindowRect(&imageRect);
if(imageRect.PtInRect(point))
m_strPos.Format("%d,%d", selectPoint.x, selectPoint.y);
else
m_strPos.Format("%d,%d", 0, 0);
UpdateData(FALSE);
ReleaseDC(pDC);
CDialog::OnMouseMove(nFlags, point);
}
//按下"关闭"按钮执行的处理函数
void CSearchObjectDlg::OnCloseinsearchdlg()
{
// TODO: Add your control notification handler code here
if(bFlagTimerKilled ==FALSE) //若定时器没有被关闭则关闭它
KillTimer(m_nTimerInSearchobjectDlg);
capDriverDisconnect(m_hCaptureInSearchObjectDlg ); //断开视频连接
StopCar(); //停止机器人运行
CDialog::OnCancel(); //关闭本对话框
}
BOOL CSearchObjectDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO: Add extra initialization here
// flags=1;
theApp.bFirstFilter = TRUE; //第一次中值滤波
theApp.colObject = RED; //默认目标物为红色
theApp.colObstacle = BLUE; //默认障碍物为蓝色
m_SelObjectColor = "红色";
m_SelObstacleColor = "蓝色";
m_ctrlComboObjectColor.SetCurSel(0); //目标物初始化为红色
m_ctrlComboObstacleColor.SetCurSel(0); //障碍物初始化为蓝色
bFlagTimerKilled = FALSE; //定时器未关闭
theApp.bLeftEdge = FALSE; //机器人未遇到左列边缘
theApp.bRightEdge = FALSE; //机器人未遇到右列边缘
//按钮使能控制
GetDlgItem(IDC_OPENCOLORVIDEO) -> EnableWindow(TRUE);
GetDlgItem(IDC_CLOSECOLORVIDEO) -> EnableWindow(FALSE);
GetDlgItem(IDC_STARTINSEARCHOBJECT) -> EnableWindow(FALSE);
GetDlgItem(IDC_CARSTOPINSEARCHOBJECT) -> EnableWindow(FALSE);
GetDlgItem(IDC_CONFIGVIDEOINSEARCHDLG) -> EnableWindow(FALSE);
GetDlgItem(IDC_THRESHOLDSETINSEARCHOBJECTDLG) -> EnableWindow(FALSE);
GetDlgItem(IDC_PARAMETERSETINSEARCHOBJECTDLG) -> EnableWindow(FALSE);
for(int i=0; i<WIDTH*HEIGHT*3; i++)
theApp.tempColor[i]= 255; //初始化
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
/*
//按下"返回"按钮执行的处理函数
void CSearchObjectDlg::OnBackinsearchdlg()
{
// TODO: Add your control notification handler code here
if(bFlagTimerKilled ==FALSE) //若定时器没有被关闭则关闭它
KillTimer(m_nTimerInSearchobjectDlg);
capDriverDisconnect(m_hCaptureInSearchObjectDlg ); //断开视频连接
StopCar(); //停止机器人运行
CDialog::OnCancel(); //关闭本对话框
// AfxGetMainWnd()->ShowWindow(SW_SHOW); //显示主对话框
}
*/
//按下"启动机器人"按钮执行的处理函数
void CSearchObjectDlg::OnStartinsearchobject()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_CARSTOPINSEARCHOBJECT) -> EnableWindow(TRUE);
//目标物颜色和障碍物颜色不能相同
if(m_SelObjectColor == m_SelObstacleColor)
{
AfxMessageBox("目标物颜色和障碍物颜色不能相同!",MB_OK);
return;
}
else
{
if(m_SelObjectColor=="红色")
theApp.colObject=RED; //目标物为红色
else
if(m_SelObjectColor=="蓝色")
theApp.colObject=BLUE; //目标物为蓝色
if(m_SelObstacleColor=="红色")
theApp.colObstacle=RED; //障碍物为红色
else
if(m_SelObstacleColor=="蓝色")
theApp.colObstacle=BLUE; //障碍物为蓝色
}
m_nTimerInSearchobjectDlg=SetTimer(3,11,NULL); //启动定时器
}
//按下"视频配置"按钮执行的处理函数
void CSearchObjectDlg::OnConfigvideoinsearchdlg()
{
// TODO: Add your control notification handler code here
CVideoConfigureDlg dlgInSearchObject; //启动视频配置对话框
dlgInSearchObject.DoModal();
}
void CSearchObjectDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
/*
theApp.bFirstFilter = TRUE;
MedianFilter();
theApp.bFirstFilter = FALSE;
MedianFilter();
GrayScale(); //灰度化
SobelEdgeDection();
// Skeleton();
DisplayGrayFrames(); //显示灰度图像
*/
theApp.bFirstFilter = TRUE; //先对原始图象进行中值滤波
MedianFilter(); //第一次中值滤波
ColorSegment(); //阈值分割
theApp.bFirstFilter = FALSE; //再对阈值分割后的图像进行中值滤波
MedianFilter(); //再一次中值滤波
DecisionSearchObject(); //寻找目标物决策函数
if(theApp.bFlagObject == TRUE) //发现目标物
if(SearchObjectSucess()==TRUE) //成功找到目标物
{
KillTimer(m_nTimerInSearchobjectDlg); //关闭定时器
bFlagTimerKilled =TRUE; //定时器已经被关闭
AfxMessageBox("机器人已经成功找到目标物!",MB_OK);
MessageBeep(0xFFFFFFFF); // Beep
}
else
bFlagTimerKilled =FALSE;
/*
if(theApp.bFlagObstacle == TRUE) //发现障碍物
{
KillTimer(m_nTimerInSearchobjectDlg);
AfxMessageBox("机器人成功检测到障碍物!",MB_OK);
MessageBeep(0xFFFFFFFF); // Beep
}
if(theApp.bFlagEdge == TRUE) //发现边缘
{
KillTimer(m_nTimerInSearchobjectDlg);
AfxMessageBox("机器人成功检测到边缘!",MB_OK);
MessageBeep(0xFFFFFFFF); // Beep
}*/
DisplayFrames(); //显示视频
CDialog::OnTimer(nIDEvent);
}
//按下"停止机器人"按钮执行的处理函数
void CSearchObjectDlg::OnCarstopinsearchobject()
{
// TODO: Add your control notification handler code here
GetDlgItem(IDC_CARSTOPINSEARCHOBJECT) -> EnableWindow(FALSE);
StopCar(); //停止机器人
if(bFlagTimerKilled ==FALSE) //若定时器没有被关闭
KillTimer(m_nTimerInSearchobjectDlg); //关闭定时器
}
//目标物颜色组合框关闭后执行的处理函数
void CSearchObjectDlg::OnCloseupComboobject()
{
// TODO: Add your control notification handler code here
int nSelection;
if((nSelection=m_ctrlComboObjectColor.GetCurSel())!=CB_ERR) //注意运算的优先顺序
{
m_ctrlComboObjectColor.GetLBText(nSelection,m_SelObjectColor);
UpdateData(FALSE);
/*
if(m_SelObjectColor=="红色")
theApp.colObject=RED; //目标物为红色
else
if(m_SelObjectColor=="蓝色")
theApp.colObject=BLUE; //目标物为蓝色
CWnd* pColorWnd = GetDlgItem(IDC_OBJECTCOLOR);
CDC* pColorDC = pColorWnd->GetDC();
CRect rect;
pColorWnd->GetClientRect(&rect);
CBrush newbrh(theApp.colObject);
CBrush *pOldBrush;
pOldBrush=pColorDC->SelectObject(&newbrh);
pColorDC->Rectangle(&rect);
pColorDC->SelectObject(pOldBrush);
ReleaseDC(pColorDC);
*/
CWnd* pColorWnd = GetDlgItem(IDC_COMBOOBJECT);
CRect rect;
pColorWnd->GetClientRect(&rect);
pColorWnd->InvalidateRect(&rect,FALSE);
objectColor();
}
}
//障碍物颜色组合框关闭后执行的处理函数
void CSearchObjectDlg::OnCloseupComboobstacle()
{
// TODO: Add your control notification handler code here
int nSelection;
if((nSelection=m_ctrlComboObstacleColor.GetCurSel())!=CB_ERR) //注意运算的优先顺序
{
m_ctrlComboObstacleColor.GetLBText(nSelection,m_SelObstacleColor);
/*
if(m_SelObstacleColor=="红色")
theApp.colObstacle=RED; //障碍物为红色
else
if(m_SelObstacleColor=="蓝色")
theApp.colObstacle=BLUE; //障碍物为蓝色
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -