📄 mainfrm.cpp
字号:
ppBuff[0] = m_pRawBuffer;
HVSTATUS status= HVSnapShot(m_hhv, ppBuff, 1);
HV_MESSAGE(status);
if (HV_SUCCESS(status)) {
ShowImage();
}
}
void CMainFrame::OnUpdateViewSnapshot(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable( ! m_bSnapping);
}
BOOL CMainFrame::SetLutTable(double dRatioR,double dRatioG,double dRatioB)
{
if(dRatioR <=0)
return FALSE;
if(dRatioG <=0)
return FALSE;
if(dRatioB <=0)
return FALSE;
for(int i=0;i<256;i++)
{
if(m_bIsGammaCorrect)
{
m_pLutR[i] = min((int)(m_pLutGamma[i]*dRatioR),255);
m_pLutG[i] = min((int)(m_pLutGamma[i]*dRatioG),255);
m_pLutB[i] = min((int)(m_pLutGamma[i]*dRatioB),255);
}
else
{
m_pLutR[i] = min((int)(i*dRatioR),255);
m_pLutG[i] = min((int)(i*dRatioG),255);
m_pLutB[i] = min((int)(i*dRatioB),255);
}
}
return TRUE;
}
//得到输出窗口大小
int CMainFrame::GetOutputWinWdith()
{
return m_rcOutputWindow.Width();
}
void CMainFrame::OnConversionBest()
{
m_ConversionType = BAYER2RGB_PIXELGROUPING;
}
void CMainFrame::OnUpdateConversionBest(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ConversionType == BAYER2RGB_PIXELGROUPING);
}
void CMainFrame::OnConversionFast()
{
m_ConversionType = BAYER2RGB_NEIGHBOUR;
}
void CMainFrame::OnUpdateConversionFast(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ConversionType == BAYER2RGB_NEIGHBOUR);
}
void CMainFrame::OnConversionNormal()
{
m_ConversionType = BAYER2RGB_PATTERN;
}
void CMainFrame::OnUpdateConversionNormal(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_ConversionType == BAYER2RGB_PATTERN);
}
void CMainFrame::OnViewMode0()
{
HVSTATUS status = STATUS_OK;
m_Resolution = RES_MODE0;
//get the max size of the output window
int nBuffSize;
HVGetDeviceInfo(m_hhv, DESC_RESOLUTION, NULL,&nBuffSize);
BYTE *pbContext = new BYTE[nBuffSize];
DWORD *pdContext =(DWORD *)(pbContext);
HVGetDeviceInfo(m_hhv, DESC_RESOLUTION, pdContext,&nBuffSize);
m_nMaxWidth = *(pdContext + 2*RES_MODE0);
m_nMaxHeight = *(pdContext + 2*RES_MODE0 + 1);
delete []pbContext;
AdjustWindow();
//在设置输出窗口前,停止采集
if (m_bSnapping)
{
HVStopSnap(m_hhv);
}
status = HVSetResolution(m_hhv, RES_MODE0);
status = HVSetOutputWindow(m_hhv,
m_rcOutputWindow.left,
m_rcOutputWindow.top,
m_rcOutputWindow.Width(),
m_rcOutputWindow.Height()
);
//在设置输出窗口后,开始采集
if (m_bSnapping)
{
//只定义一个缓冲区,
BYTE * ppBuffer[1];
ppBuffer[0] = m_pRawBuffer;
status = HVStartSnap(m_hhv,ppBuffer,1);
}
}
void CMainFrame::OnUpdateViewMode0(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_Resolution == RES_MODE0);
}
void CMainFrame::OnViewMode1()
{
HVSTATUS status = STATUS_OK;
m_Resolution = RES_MODE1;
//get the max size of the output window
int nBuffSize;
HVGetDeviceInfo(m_hhv, DESC_RESOLUTION, NULL,&nBuffSize);
BYTE *pbContext = new BYTE[nBuffSize];
DWORD *pdContext =(DWORD *)(pbContext);
HVGetDeviceInfo(m_hhv, DESC_RESOLUTION, pdContext,&nBuffSize);
m_nMaxWidth = *(pdContext + 2*RES_MODE1);
m_nMaxHeight = *(pdContext + 2*RES_MODE1 + 1);
delete []pbContext;
AdjustWindow();
//在设置输出窗口前,停止采集
if (m_bSnapping)
{
HVStopSnap(m_hhv);
}
status = HVSetResolution(m_hhv, RES_MODE1);
status = HVSetOutputWindow(m_hhv,
m_rcOutputWindow.left,
m_rcOutputWindow.top,
m_rcOutputWindow.Width(),
m_rcOutputWindow.Height()
);
//在设置输出窗口后,开始采集
if (m_bSnapping)
{
//只定义一个缓冲区,
BYTE * ppBuffer[1];
ppBuffer[0] = m_pRawBuffer;
status = HVStartSnap(m_hhv,ppBuffer,1);
}
}
void CMainFrame::OnUpdateViewMode1(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_Resolution == RES_MODE1);
}
void CMainFrame::OnViewMode2()
{
HVSTATUS status = STATUS_OK;
m_Resolution = RES_MODE2;
//get the max size of the output window
int nBuffSize;
HVGetDeviceInfo(m_hhv, DESC_RESOLUTION, NULL,&nBuffSize);
BYTE *pbContext = new BYTE[nBuffSize];
DWORD *pdContext =(DWORD *)(pbContext);
HVGetDeviceInfo(m_hhv, DESC_RESOLUTION, pdContext,&nBuffSize);
m_nMaxWidth = *(pdContext + 2*RES_MODE2);
m_nMaxHeight = *(pdContext + 2*RES_MODE2 + 1);
delete []pbContext;
AdjustWindow();
//在设置输出窗口前,停止采集
if (m_bSnapping)
{
HVStopSnap(m_hhv);
}
status = HVSetResolution(m_hhv, RES_MODE1);
status = HVSetOutputWindow(m_hhv,
m_rcOutputWindow.left,
m_rcOutputWindow.top,
m_rcOutputWindow.Width(),
m_rcOutputWindow.Height()
);
//在设置输出窗口后,开始采集
if (m_bSnapping)
{
//只定义一个缓冲区,
BYTE * ppBuffer[1];
ppBuffer[0] = m_pRawBuffer;
status = HVStartSnap(m_hhv,ppBuffer,1);
}
}
void CMainFrame::OnUpdateViewMode2(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_Resolution == RES_MODE2);
}
void CMainFrame:: Format24To8(BYTE *pDestBit8,BYTE *pSrceBit24, int nWid,int nHei)
{
if(pDestBit8 == NULL)
return;
if(pSrceBit24 == NULL)
return;
if(nWid <=0 || nHei <=0)
return;
if(m_pLutMapping == NULL)
return;
int i=0,j=0;
int nPos=0;
PBYTE pYUVLut;
for(i=0;i<nHei;i++)
{
nPos = i*nWid*3;
for(j=0;j<nWid;j++)
{
//数据排列为 GBR
pYUVLut = m_pLutMapping + 256*256*pSrceBit24[nPos+2] + 256*pSrceBit24[nPos+1] + pSrceBit24[nPos];
*pDestBit8 = *pYUVLut;
pDestBit8 ++;
nPos +=3;
}
}
}
PBYTE CMainFrame::CreateLutMapFile(LPCTSTR lpFileName)
{
if(strlen(lpFileName)<=0)
return NULL;
//如果文件已经存在
if(PathFileExists(lpFileName))
{
HANDLE hFile = CreateFile(lpFileName, //
GENERIC_WRITE |GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
// 创建文件映射内核对象,句柄保存于hFileMapping,最大16M
m_hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE,
0, 0x1000000, NULL);
// 释放文件内核对象
CloseHandle(hFile);
// 将文件数据映射到进程的地址空间, 大小为16M
PBYTE pData = (PBYTE)MapViewOfFile(m_hFileMapping,
FILE_MAP_ALL_ACCESS,
0, 0, 0x1000000);
return pData;
}
else //如果文件不存在,则建立文件并写入数据
{
HANDLE hFile = CreateFile(lpFileName,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ,
NULL,
CREATE_ALWAYS,
FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
// 创建文件映射内核对象,句柄保存于hFileMapping,最大16M
m_hFileMapping = CreateFileMapping(hFile,NULL,PAGE_READWRITE,
0, 0x1000000, NULL);
// 释放文件内核对象
CloseHandle(hFile);
// 将文件数据映射到进程的地址空间, 大小为16M
PBYTE pData = (PBYTE)MapViewOfFile(m_hFileMapping,
FILE_MAP_ALL_ACCESS,
0, 0, 0x1000000);
if(pData == NULL)
return NULL;
//YUV 转换查值表 初始化
PBYTE pYUVLut;
for(int i=0;i<256;i++)
{
for(int j=0;j<256;j++)
{
for(int k=0;k<256;k++)
{
pYUVLut = pData + i*256*256 + j*256 + k;
*pYUVLut = (BYTE)(0.299*i + 0.587*j + 0.114*k); //参考RGB->YUV转换公式
}
}
}
return pData;
}
}
void CMainFrame::OnGammaCorrect()
{
m_bIsGammaCorrect = TRUE;
CDlgGamma dlg;
dlg.m_dGammRatio = m_dGammRatio;
if(dlg.DoModal() == IDOK)
{
m_dGammRatio = dlg.m_dGammRatio;
//设置Gamma查值表的值
SetGammaLut(m_pLutGamma,m_dGammRatio);
//更新颜色查值表
SetLutTable(m_dRatioR,m_dRatioG,m_dRatioB);
}
}
void CMainFrame::OnUpdateGammaCorrect(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_bIsGammaCorrect);
}
void CMainFrame::OnCancelGamma()
{
m_bIsGammaCorrect = FALSE;
SetLutTable(m_dRatioR,m_dRatioG,m_dRatioB);
}
void CMainFrame::OnUpdateCancelGamma(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(!m_bIsGammaCorrect);
}
void CMainFrame::OnGetBadPiexes()
{
CString strMsg = "请确认已经将镜头完全遮盖!";
if(MessageBox(strMsg, "Notice", MB_OKCANCEL) != IDOK)
return;
m_bIsToGetBadPixel = TRUE;
//得到坏点的时候,必须把输出窗口设置成最大
//在设置输出窗口前,停止采集
if (m_bSnapping)
{
HVStopSnap(m_hhv);
}
HVSTATUS status = HVSetOutputWindow(m_hhv,
0,
0,
m_nMaxWidth,
m_nMaxHeight
);
//在设置输出窗口后,开始采集
if (m_bSnapping)
{
//只定义一个缓冲区,
BYTE * ppBuffer[1];
ppBuffer[0] = m_pRawBuffer;
status = HVStartSnap(m_hhv,ppBuffer,1);
}
}
void CMainFrame::OnUpdateGetBadPiexes(CCmdUI* pCmdUI)
{
pCmdUI->Enable( (m_bSnapping));
pCmdUI->SetCheck(m_bIsToGetBadPixel);
}
void CMainFrame::OnEliminateBadPixels()
{
m_bIsToRemoveBadPixel = !m_bIsToRemoveBadPixel;
}
void CMainFrame::OnUpdateEliminateBadPixels(CCmdUI* pCmdUI)
{
pCmdUI->Enable( (m_bSnapping) );
pCmdUI->SetCheck(m_bIsToRemoveBadPixel);
}
void CMainFrame::OnGetTemplate()
{
CString strMsg = "请确认已经将镜头面对均匀光线!";
if(MessageBox(strMsg, "Notice", MB_OKCANCEL) != IDOK)
return;
m_bIsToGetTemplate = TRUE;
//得到坏点的时候,必须把输出窗口设置成最大
//在设置输出窗口前,停止采集
if (m_bSnapping)
{
HVStopSnap(m_hhv);
}
HVSTATUS status = HVSetOutputWindow(m_hhv,
0,
0,
m_nMaxWidth,
m_nMaxHeight
);
//在设置输出窗口后,开始采集
if (m_bSnapping)
{
//只定义一个缓冲区,
BYTE * ppBuffer[1];
ppBuffer[0] = m_pRawBuffer;
status = HVStartSnap(m_hhv,ppBuffer,1);
}
}
void CMainFrame::OnUpdateGetTemplate(CCmdUI* pCmdUI)
{
pCmdUI->Enable( (m_bSnapping) );
pCmdUI->SetCheck(m_bIsToGetTemplate);
}
void CMainFrame::OnTemplateCorrect()
{
m_bIsTemplateCorrect = !m_bIsTemplateCorrect;
}
void CMainFrame::OnUpdateTemplateCorrect(CCmdUI* pCmdUI)
{
pCmdUI->Enable( (m_bSnapping) && !m_bIsToGetTemplate);
pCmdUI->SetCheck(m_bIsTemplateCorrect);
}
void CMainFrame::OnSnapspeedNormal()
{
if(m_bIsSnapSpeedSprted)
{
m_SnapSpeed = NORMAL_SPEED;
HVSTATUS status = HVSetSnapSpeed(m_hhv,m_SnapSpeed);
SetExposureTime(GetOutputWinWdith(),m_lTintUpper,m_lTintLower);
}
}
void CMainFrame::OnUpdateSnapspeedNormal(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_SnapSpeed == NORMAL_SPEED);
pCmdUI->Enable(m_bIsSnapSpeedSprted);
}
void CMainFrame::OnSnpaspeedHigh()
{
if(m_bIsSnapSpeedSprted)
{
m_SnapSpeed = HIGH_SPEED;
HVSTATUS status = HVSetSnapSpeed(m_hhv,m_SnapSpeed);
SetExposureTime(GetOutputWinWdith(),m_lTintUpper,m_lTintLower);
}
}
void CMainFrame::OnUpdateSnpaspeedHigh(CCmdUI* pCmdUI)
{
pCmdUI->SetCheck(m_SnapSpeed == HIGH_SPEED);
pCmdUI->Enable(m_bIsSnapSpeedSprted);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -