📄 thresholdset.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 + -