⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 searchobjectdlg.cpp

📁 机器人视觉处理程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

		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 + -