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

📄 thresholdset.cpp

📁 机器人视觉处理程序
💻 CPP
字号:
// ThresholdSet.cpp : implementation file
//

#include "stdafx.h"
#include "IRExpPlatform.h"
#include "ThresholdSet.h"
#include "global.h"

#include "SearchObjectDlg.h"
#include "TeleoperationDlg.h"
#include "WalkWhiteDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CThresholdSet dialog


CThresholdSet::CThresholdSet(CWnd* pParent /*=NULL*/)
	: CDialog(CThresholdSet::IDD, pParent)
{
	//{{AFX_DATA_INIT(CThresholdSet)
	m_strIntensityR = _T("");
	m_strIntensityG = _T("");
	m_strIntensityB = _T("");
	m_r = _T("");
	m_g = _T("");
	m_b = _T("");
	m_rWhiteMax = 0.0f;
	m_gWhiteMax = 0.0f;
	m_bWhiteMax = 0.0f;
	m_rWhiteMin = 0.0f;
	m_gWhiteMin = 0.0f;
	m_bWhiteMin = 0.0f;
	m_rYellowMin = 0.0f;
	m_gYellowMin = 0.0f;
	m_bYellowMin = 0.0f;
	m_rYellowMax = 0.0f;
	m_gYellowMax = 0.0f;
	m_bYellowMax = 0.0f;
	m_gBlueMin = 0.0f;
	m_bBlueMin = 0.0f;
	m_rBlueMax = 0.0f;
	m_gBlueMax = 0.0f;
	m_bBlueMax = 0.0f;
	m_rBlueMin = 0.0f;
	m_bRedMin = 0.0f;
	m_gRedMin = 0.0f;
	m_rRedMin = 0.0f;
	m_bRedMax = 0.0f;
	m_gRedMax = 0.0f;
	m_rRedMax = 0.0f;
	//}}AFX_DATA_INIT
}


void CThresholdSet::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CThresholdSet)
	DDX_Text(pDX, IDC_INTENSITYR, m_strIntensityR);
	DDX_Text(pDX, IDC_INTENSITYG, m_strIntensityG);
	DDX_Text(pDX, IDC_INTENSITYB, m_strIntensityB);
	DDX_Text(pDX, IDC_COLORR, m_r);
	DDX_Text(pDX, IDC_COLORG, m_g);
	DDX_Text(pDX, IDC_COLORB, m_b);
	DDX_Text(pDX, IDC_WHITEMAXR, m_rWhiteMax);
	DDX_Text(pDX, IDC_WHITEMAXG, m_gWhiteMax);
	DDX_Text(pDX, IDC_WHITEMAXB, m_bWhiteMax);
	DDX_Text(pDX, IDC_WHITEMINR, m_rWhiteMin);
	DDX_Text(pDX, IDC_WHITEMING, m_gWhiteMin);
	DDX_Text(pDX, IDC_WHITEMINB, m_bWhiteMin);
	DDX_Text(pDX, IDC_YELLOWMINR, m_rYellowMin);
	DDX_Text(pDX, IDC_YELLOWMING, m_gYellowMin);
	DDX_Text(pDX, IDC_YELLOWMINB, m_bYellowMin);
	DDX_Text(pDX, IDC_YELLOWMAXR, m_rYellowMax);
	DDX_Text(pDX, IDC_YELLOWMAXG, m_gYellowMax);
	DDX_Text(pDX, IDC_YELLOWMAXB, m_bYellowMax);
	DDX_Text(pDX, IDC_BLUEMING, m_gBlueMin);
	DDX_Text(pDX, IDC_BLUEMINB, m_bBlueMin);
	DDX_Text(pDX, IDC_BLUEMAXR, m_rBlueMax);
	DDX_Text(pDX, IDC_BLUEMAXG, m_gBlueMax);
	DDX_Text(pDX, IDC_BLUEMAXB, m_bBlueMax);
	DDX_Text(pDX, IDC_BLUEMINR, m_rBlueMin);
	DDX_Text(pDX, IDC_REDMINB, m_bRedMin);
	DDX_Text(pDX, IDC_REDMING, m_gRedMin);
	DDX_Text(pDX, IDC_REDMINR, m_rRedMin);
	DDX_Text(pDX, IDC_REDMAXB, m_bRedMax);
	DDX_Text(pDX, IDC_REDMAXG, m_gRedMax);
	DDX_Text(pDX, IDC_REDMAXR, m_rRedMax);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CThresholdSet, CDialog)
	//{{AFX_MSG_MAP(CThresholdSet)
	ON_WM_TIMER()
	ON_WM_LBUTTONDOWN()
	ON_WM_CANCELMODE()
	ON_WM_PAINT()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CThresholdSet message handlers

void CThresholdSet::DisplayFrames()
{
	CWnd* pThresholdSet;
	CDC* pDC;
	CDC dcMemory;
	CBitmap  *pOldBmp;
	CBitmap newBmp;			//公用位图对象
	CRect videoRect;


	pThresholdSet = GetDlgItem(IDC_VEDIOINTHRESHOLDDLG);
	pDC = pThresholdSet -> GetDC();
	pThresholdSet -> GetWindowRect(&videoRect);
	newBmp.CreateCompatibleBitmap(pDC, WIDTH, HEIGHT);//在这里还调用的是全局的对象theApp

	
	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++)
		{
			//00bbggrr
			r = theApp.ColorStructure[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 2];  //取得r分量
			g = theApp.ColorStructure[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 1];  //取得g分量
			b = theApp.ColorStructure[(HEIGHT-i-1) * WIDTH * 3 + j * 3 + 0];  //取得b分量
			dcMemory.SetPixel(j,i,RGB(r,g,b));								 //绘制坐标为(j,i)的像素点
		}

	//从(0,0)点开始从内存兼容位图中拷贝图像至设备环境句柄
	pDC -> BitBlt(0, 0, videoRect.Width(),videoRect.Height(), &dcMemory, 0, 0, SRCCOPY);     
	UpdateWindow();

	dcMemory.SelectObject(pOldBmp);
	newBmp.DeleteObject();					//释放newBmp所占的内存

	ReleaseDC(&dcMemory);					//释放内存设备环境
	ReleaseDC(pDC);							//释放pDC

	

}

void CThresholdSet::OnCancel() 
{
	// TODO: Add extra cleanup here
	KillTimer(m_nTimerInThresholdSet);		//关闭定时器
	CDialog::OnCancel();
}

void CThresholdSet::OnOK() 
{
	// TODO: Add extra validation here

	KillTimer(m_nTimerInThresholdSet);		//关闭定时器
	
	UpdateData(TRUE);						//更新阈值至对应变量
	
	if(m_rWhiteMax <= m_rWhiteMin
	|| m_gWhiteMax <= m_gWhiteMin
	|| m_bWhiteMax <= m_bWhiteMin
	|| m_rRedMax   <= m_rRedMin
	|| m_gRedMax   <= m_gRedMin
	|| m_bRedMax   <= m_bRedMin
	|| m_rYellowMax<= m_rYellowMin
	|| m_gYellowMax<= m_gYellowMin
	|| m_bYellowMax<= m_bYellowMin
	|| m_rBlueMax  <= m_rBlueMin
	|| m_gBlueMax  <= m_gBlueMin
	|| m_bBlueMax  <= m_bBlueMin)
	{
		MessageBox("上限值应大于下限值!","输入值错误!",MB_OK|MB_ICONWARNING);
		return;
	}
	//rgb是RGB的归一化
	if(m_rWhiteMax >1 || m_rWhiteMin  <0
	|| m_gWhiteMax >1 || m_gWhiteMin  <0
	|| m_bWhiteMax >1 || m_bWhiteMin  <0
	|| m_rRedMax   >1 || m_rRedMin	  <0
	|| m_gRedMax   >1 || m_gRedMin    <0
	|| m_bRedMax   >1 || m_bRedMin    <0
	|| m_rYellowMax>1 || m_rYellowMin <0
	|| m_gYellowMax>1 || m_gYellowMin <0
	|| m_bYellowMax>1 || m_bYellowMin <0
	|| m_rBlueMax  >1 || m_rBlueMin   <0
	|| m_gBlueMax  >1 || m_gBlueMin   <0
	|| m_bBlueMax  >1 || m_bBlueMin   <0)
		{
			MessageBox("上限值应不大于1,下限值应不小于0!","输入值错误!",MB_OK|MB_ICONWARNING);
			return;
		}			

	//更新阈值
	theApp.rWhiteMax	=	m_rWhiteMax;
	theApp.rWhiteMin	=	m_rWhiteMin;
	theApp.gWhiteMax	=	m_gWhiteMax;
	theApp.gWhiteMin	=	m_gWhiteMin;
	theApp.bWhiteMax	=	m_bWhiteMax;
	theApp.bWhiteMin	=	m_bWhiteMin;

	theApp.rRedMax		=	m_rRedMax;
	theApp.rRedMin		=	m_rRedMin;
	theApp.gRedMax		=	m_gRedMax;
	theApp.gRedMin		=	m_gRedMin;
	theApp.bRedMax		=	m_bRedMax;
	theApp.bRedMin		=	m_bRedMin;

	theApp.rYellowMax	=	m_rYellowMax;
	theApp.rYellowMin	=	m_rYellowMin;
	theApp.gYellowMax	=	m_gYellowMax;
	theApp.gYellowMin	=	m_gYellowMin;
	theApp.bYellowMax	=	m_bYellowMax;
	theApp.bYellowMin	=	m_bYellowMin;

	theApp.rBlueMax		=	m_rBlueMax;
	theApp.rBlueMin		=	m_rBlueMin;
	theApp.gBlueMax		=	m_gBlueMax;
	theApp.gBlueMin		=	m_gBlueMin;
	theApp.bBlueMax		=	m_bBlueMax;
	theApp.bBlueMin		=	m_bBlueMin;

	CDialog::OnOK();
}

BOOL CThresholdSet::OnInitDialog() 
{
	CDialog::OnInitDialog();	
	// TODO: Add extra initialization here

	//flags==0表示第一次打开本窗口,flags==1表示非第一次
	flags = 0;

	//以下六行初始化RGB,rgb各分量为0
	m_strIntensityR.Format("%d",0);            
	m_strIntensityG.Format("%d",0);
	m_strIntensityB.Format("%d",0);
	m_r.Format("%4.3f",0.0);
	m_g.Format("%4.3f",0.0);
	m_b.Format("%4.3f",0.0);

	////////////////////////////////////////////////////
	//初始化阈值	
	m_rWhiteMax	=	theApp.rWhiteMax;
	m_rWhiteMin	=	theApp.rWhiteMin;
	m_gWhiteMax	=	theApp.gWhiteMax;
	m_gWhiteMin	=	theApp.gWhiteMin;
	m_bWhiteMax	=	theApp.bWhiteMax;
	m_bWhiteMin	=	theApp.bWhiteMin;
	
	m_rRedMax	=	theApp.rRedMax;
	m_rRedMin	=	theApp.rRedMin;
	m_gRedMax	=	theApp.gRedMax;
	m_gRedMin	=	theApp.gRedMin;
	m_bRedMax	=	theApp.bRedMax;
	m_bRedMin	=	theApp.bRedMin;	

	m_rYellowMax=	theApp.rYellowMax;
	m_rYellowMin=	theApp.rYellowMin;
	m_gYellowMax=	theApp.gYellowMax;
	m_gYellowMin=	theApp.gYellowMin;
	m_bYellowMax=	theApp.bYellowMax;
	m_bYellowMin=	theApp.bYellowMin;

	m_rBlueMax	=	theApp.rBlueMax;
	m_rBlueMin	=	theApp.rBlueMin;
	m_gBlueMax	=	theApp.gBlueMax;
	m_gBlueMin	=	theApp.gBlueMin;
	m_bBlueMax	=	theApp.bBlueMax;
	m_bBlueMin	=	theApp.bBlueMin;
	///////////////////////////////////////////////////

	//更新上述值至各控件窗口
	UpdateData(FALSE);

	//打开定时器
	m_nTimerInThresholdSet = SetTimer(2,1000/RATE, NULL);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CThresholdSet::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	DisplayFrames();
	
	CDialog::OnTimer(nIDEvent);
}

void CThresholdSet::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	UpdateData(TRUE);		//更新阈值至对应变量

	CWnd* pWnd = GetDlgItem(IDC_VEDIOINTHRESHOLDDLG);
	CDC* pDC = pWnd -> GetDC();
	CPoint selectPoint;                                       //鼠标选择点相对于整个对话框窗口的坐标
	CRect imageRect;                                          //保存图像阈值分割处理后显示Picture控件窗口                              

	selectPoint.x = point.x; 
	selectPoint.y = point.y;

    MapWindowPoints(pWnd, &selectPoint, 1);                   //将鼠标选择点相对于整个对话框窗口的坐标转化
	                                                          //为相对于图像阈值分割处理后显示picture控件的坐标
	ClientToScreen(&point);                                   //再转化为相对于整个显示器屏幕的坐标

	pWnd -> GetWindowRect(&imageRect);                        //得到图像阈值分割处理后显示Picture控件矩形
	if(imageRect.PtInRect(point))                             //如果选择点在picture控件对应的矩形内部
	{
		flags=1;
		m_colRef= pDC -> GetPixel(selectPoint);               //取得选择点的RGB值
		m_strIntensityR.Format("%d",GetRValue(m_colRef));     //取得选择点RGB值的R分量
		m_strIntensityG.Format("%d",GetGValue(m_colRef));     //取得选择点RGB值的G分量
		m_strIntensityB.Format("%d",GetBValue(m_colRef));     //取得选择点RGB值的B分量

		if(GetRValue(m_colRef) == 0 && GetGValue(m_colRef) == 0 && GetBValue(m_colRef) == 0)
		{
			//当r=g=b=0时,人为指定显示0,因为r=r/(r+g+b)分母为0
			m_r.Format("%d",0);
			m_g.Format("%d",0);
			m_b.Format("%d",0);
		}
		else
		{
			int nSumRGB = GetRValue(m_colRef)+GetGValue(m_colRef)+GetBValue(m_colRef);
			m_r.Format("%4.3f",GetRValue(m_colRef)*1.0/nSumRGB);  //计算r=R/(R+G+B)
			m_g.Format("%4.3f",GetGValue(m_colRef)*1.0/nSumRGB);  //计算g=G/(R+G+B)
			m_b.Format("%4.3f",GetBValue(m_colRef)*1.0/nSumRGB);  //计算b=B/(R+G+B)
		}

		UpdateData(FALSE);										  //显示选择点的RGB,rgb值

		CWnd* pColorWnd = GetDlgItem(IDC_SELECTIONCOLOR);
		CRect rect;
		pColorWnd -> GetClientRect(&rect);
		pColorWnd -> InvalidateRect(&rect,FALSE);

	}

	ReleaseDC(pDC);												 //释放内存设备环境指针

	PaintSelectionColor();										//用选择点的颜色绘制picture控件窗口
	
	
	CDialog::OnLButtonDown(nFlags, point);
}


void CThresholdSet::PaintSelectionColor()
{
	   if(1==flags)				
    {
	    PAINTSTRUCT pPaint;

		CWnd* pColorWnd = GetDlgItem(IDC_SELECTIONCOLOR);
		CDC *pColorDC=pColorWnd->BeginPaint(&pPaint);				//选择性绘制窗口,一定要和EndPaint()配对使用

		CBrush newbrh(m_colRef);
		CBrush *pOldBrush;

		pOldBrush=pColorDC->SelectObject(&newbrh);		
		pColorDC->Rectangle(&(pPaint.rcPaint));

		pColorDC->SelectObject(pOldBrush);	
        pColorWnd->EndPaint(&pPaint);

		newbrh.DeleteObject();
		ReleaseDC(pColorDC);
	}

}

void CThresholdSet::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	// TODO: Add your message handler code here
	PaintSelectionColor();
	DisplayFrames();
	
	// Do not call CDialog::OnPaint() for painting messages
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -