📄 searchobjectdlg.cpp
字号:
CWnd* pColorWnd = GetDlgItem(IDC_OBTACLECOLOR);
CDC* pColorDC = pColorWnd->GetDC();
CRect rect;
pColorWnd->GetClientRect(&rect);
CBrush newbrh(theApp.colObstacle);
CBrush *pOldBrush;
pOldBrush=pColorDC->SelectObject(&newbrh);
pColorDC->Rectangle(&rect);
pColorDC->SelectObject(pOldBrush);
ReleaseDC(pColorDC);
*/
CWnd* pColorWnd = GetDlgItem(IDC_COMBOOBSTACLE);
CRect rect;
pColorWnd->GetClientRect(&rect);
pColorWnd->InvalidateRect(&rect,FALSE);
obstacleColor();
}
}
//显示灰度图像,在形状识别中用到
void CSearchObjectDlg::DisplayGrayFrames()
{
CWnd* pVideoAfterDeal;
CDC* pDC;
CDC dcMemory;
CBitmap *pOldBmp;
CBitmap newBmp; //公用位图对象
BYTE gray;
pVideoAfterDeal = GetDlgItem(IDC_AFTERDEALINSEARCHDLG);
pDC = pVideoAfterDeal -> GetDC();
newBmp.CreateCompatibleBitmap(pDC, WIDTH, HEIGHT);
dcMemory.CreateCompatibleDC(pDC);
pOldBmp = dcMemory.SelectObject(&newBmp);
BYTE r, g, b;
for(int i=0;i<HEIGHT;i++)
for(int j=0;j<WIDTH;j++)
{
r=theApp.tempColor[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 2];
g=theApp.tempColor[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 1];
b=theApp.tempColor[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 0];
gray = BYTE(0.299 * r + 0.587 * g + 0.114 * b);
dcMemory.SetPixel(j,i,RGB(gray,gray,gray));
}
pDC->BitBlt(0, 0, WIDTH, HEIGHT, &dcMemory, 0, 0, SRCCOPY);
UpdateWindow( );
dcMemory.SelectObject(pOldBmp);
newBmp.DeleteObject();
ReleaseDC(&dcMemory);
ReleaseDC(pDC);
}
//显示彩色图像,参见void CWalkWhiteDlg::DisplayFrames()
void CSearchObjectDlg::DisplayFrames()
{
CWnd* pVideoConfig;
CDC* pDC;
CDC dcMemory;
CBitmap *pOldBmp;
CBitmap newBmp; //公用位图对象
pVideoConfig = GetDlgItem(IDC_AFTERDEALINSEARCHDLG);
pDC = pVideoConfig -> GetDC();
newBmp.CreateCompatibleBitmap(pDC, WIDTH, HEIGHT);
dcMemory.CreateCompatibleDC(pDC);
pOldBmp = dcMemory.SelectObject(&newBmp);
BYTE r, g, b;
for(int i=0;i<HEIGHT;i++)
for(int j=0;j<WIDTH;j++)
{
r=theApp.tempColor[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 2];
g=theApp.tempColor[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 1];
b=theApp.tempColor[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 0];
dcMemory.SetPixel(j,i,RGB(r,g,b));
}
pDC->BitBlt(0, 0, WIDTH, HEIGHT, &dcMemory, 0, 0, SRCCOPY);
UpdateWindow( );
dcMemory.SelectObject(pOldBmp);
newBmp.DeleteObject();
ReleaseDC(&dcMemory);
ReleaseDC(pDC);
}
//初始化视频,参见HWND CWalkWhiteDlg::IniVideo(HWND m_hwn)
HWND CSearchObjectDlg::IniVideo(HWND m_hwn)
{
HWND m_hTempCapture;
CWnd *pWndBeforDeal=GetDlgItem(IDC_VIDEOINSEARCHDLG);
CRect videoRect;
CRect windowRect;
long xoffset;
long yoffset;
int hTitle;
pWndBeforDeal->GetWindowRect(&videoRect); //GetWindowRect()求取的坐标是相对于显示器左上角而言的
GetWindowRect(&windowRect);
xoffset=videoRect.TopLeft().x -windowRect.TopLeft().x;
yoffset=videoRect.TopLeft().y -windowRect.TopLeft().y;
hTitle =::GetSystemMetrics(SM_CYSIZE); //求取标题栏高度
m_hTempCapture = capCreateCaptureWindow ("CapWindow", WS_EX_CONTROLPARENT
| WS_CHILD | WS_VISIBLE, xoffset-1, yoffset-hTitle-1, videoRect.Width(), videoRect.Height(), this->m_hWnd, 0); //1微调窗口左上角坐标
ASSERT(m_hTempCapture );
CAPDRIVERCAPS capDrvCaps;
//判断采集窗口是否与0号捕获卡驱动程序相连接,
//这里采用简化的方法,因只一块捕获卡,计算机自动登记号码通常是为0
if (capDriverConnect(m_hTempCapture , 0))
{
//作默认值初始化,并得到驱动器的性能,存入CAPDRIVERCAPS结构中
capDriverGetCaps(m_hTempCapture , &capDrvCaps, sizeof(CAPDRIVERCAPS));
//如果初始化成功
if (capDrvCaps.fCaptureInitialized)
{
//设置预视帧频
capPreviewRate(m_hTempCapture , 2 * 1000 / RATE);
//设置成预视模式(preview),该方式是通过内存作
//为缓冲区来存放视频数据,它是获得视频数据的必要条件。
//另一种称为Overlay模式,它是不经过内存而是直接将
//数据传入显存中,这里它不符合我们要求。
capPreview(m_hTempCapture , TRUE);
//设置每帧结束后所调用的回调函数(默认为彩色视频)
capSetCallbackOnFrame(m_hTempCapture , FrameCallbackProc);
}
//如果初始化不成功
else{
//初始化不成功的消息框显示
AfxMessageBox("捕获卡初始化失败");
//发送WM_CLOSE消息,关闭对话框
AfxGetMainWnd()->PostMessage(WM_CLOSE);
}
}
//连接不成功
else{
//连接不成功的消息框显示
AfxMessageBox("捕获卡连接失败");
//发送WM_CLOSE消息,关闭对话框
this->PostMessage(WM_CLOSE);
}
return m_hTempCapture;
}
//按下"彩色视频开"按钮执行的处理函数
void CSearchObjectDlg::OnOpencolorvideo()
{
// TODO: Add your control notification handler code here
m_hCaptureInSearchObjectDlg=IniVideo(this->m_hWnd);
if (capDriverConnect(m_hCaptureInSearchObjectDlg, 0))
{
GetDlgItem(IDC_OPENCOLORVIDEO) -> EnableWindow(FALSE);
GetDlgItem(IDC_CLOSECOLORVIDEO) -> EnableWindow(TRUE);
GetDlgItem(IDC_STARTINSEARCHOBJECT) -> EnableWindow(TRUE);
GetDlgItem(IDC_CARSTOPINSEARCHOBJECT) -> EnableWindow(FALSE);
GetDlgItem(IDC_CONFIGVIDEOINSEARCHDLG) -> EnableWindow(TRUE);
GetDlgItem(IDC_THRESHOLDSETINSEARCHOBJECTDLG) -> EnableWindow(TRUE);
GetDlgItem(IDC_PARAMETERSETINSEARCHOBJECTDLG) -> EnableWindow(TRUE);
}
}
//按下"彩色视频关"按钮执行的处理函数
void CSearchObjectDlg::OnClosecolorvideo()
{
// TODO: Add your control notification handler code here
capDriverDisconnect(m_hCaptureInSearchObjectDlg);
KillTimer(m_nTimerInSearchobjectDlg);
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; //初始化
DisplayFrames();
}
void CSearchObjectDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
DisplayFrames();
objectColor();
obstacleColor();
// TODO: Add your message handler code here
/*
if(1==flags)
{ //得到窗口句柄
CWnd* pColorWnd = GetDlgItem(IDC_OBJECTCOLOR);
CWnd* pObsWnd = GetDlgItem(IDC_OBTACLECOLOR);
//创建设备环境
CDC* pColorDC = pColorWnd->GetDC();
CDC* pObsDC =pObsWnd ->GetDC();
CRect rect1,rect2; //得到客户区大小
pColorWnd->GetClientRect(&rect1);
pObsWnd->GetClientRect(&rect2);
CBrush Redbrush,Bluebrush; //创建默认画刷
Redbrush.CreateSolidBrush(theApp.colObject);
Bluebrush.CreateSolidBrush(theApp.colObstacle);
//将所创建的画刷选入各自设备环境
CBrush *pOldBrush=(CBrush*)pColorDC->SelectObject(&Redbrush);
CBrush*pOldbrush=(CBrush*)pObsDC->SelectObject(&Bluebrush);
//分别用各自画刷填充各自客户区
pColorDC->Rectangle(rect1);
pObsDC->Rectangle(rect2);
//恢复系统原始画刷
pColorDC->SelectObject(pOldBrush);
pObsDC->SelectObject(pOldbrush);
//释放设备环境
ReleaseDC(pColorDC);
ReleaseDC(pObsDC);
flags=0; //标志位复位
}
else
*/
// Do not call CDialog::OnPaint() for painting messages
}
void CSearchObjectDlg::objectColor()
{
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);
newbrh.DeleteObject();
ReleaseDC(pColorDC);
}
void CSearchObjectDlg::obstacleColor()
{
if(m_SelObstacleColor=="红色")
theApp.colObstacle=RED; //障碍物为红色
else
if(m_SelObstacleColor=="蓝色")
theApp.colObstacle=BLUE; //障碍物为蓝色
CWnd* pColorWnd = GetDlgItem(IDC_OBTACLECOLOR);
CDC* pColorDC = pColorWnd->GetDC();
CRect rect;
pColorWnd->GetClientRect(&rect);
CBrush newbrh(theApp.colObstacle);
CBrush *pOldBrush;
pOldBrush=pColorDC->SelectObject(&newbrh);
pColorDC->Rectangle(&rect);
pColorDC->SelectObject(pOldBrush);
newbrh.DeleteObject();
ReleaseDC(pColorDC);
}
void CSearchObjectDlg::OnThresholdsetinsearchobjectdlg()
{
// TODO: Add your control notification handler code here
CThresholdSet thresholdSetDlgInSearchObjectDlg;
thresholdSetDlgInSearchObjectDlg.DoModal();
}
void CSearchObjectDlg::OnParametersetinsearchobjectdlg()
{
// TODO: Add your control notification handler code here
CParameterSet dlgParmSet;
dlgParmSet.DoModal();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -