📄 mainfrm.cpp
字号:
}
}
if(m_bIsToRemoveBadPixel) //去除坏点
{
EraseDeadPixel(m_pRawBuffer,m_pBadPixelBuf,m_rcOutputWindow.left,m_rcOutputWindow.top,Size.cx,Size.cy,m_nMaxWidth,m_nMaxHeight);
}
if(m_bIsToGetTemplate)
{
if(m_nTempTimes ==0) //第一次作的时候必须清零
memset(m_pPatternBuf,'\0',sizeof(int)*m_nMaxWidth * m_nMaxHeight);
GetPatternNoise(m_pRawBuffer,m_pPatternBuf,m_nMaxWidth,m_nMaxHeight);
m_nTempTimes ++ ;
if(m_nTempTimes >= 10)
{
AvgPatternNoise(m_pPatternBuf,m_nMaxWidth,m_nMaxHeight,m_nTempTimes);
m_bIsToGetTemplate = FALSE;
m_nTempTimes =0;
/*得到模板后,恢复原来采集窗口*/
//在设置输出窗口前,停止采集
if (m_bSnapping)
{
HVStopSnap(m_hhv);
}
HVSTATUS 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);
}
}
}
if(m_bIsTemplateCorrect)
{
FixPatternNoise(m_pRawBuffer,m_pPatternBuf,m_rcOutputWindow.left,m_rcOutputWindow.top,Size.cx,Size.cy,m_nMaxWidth,m_nMaxHeight);
}
ConvertBayer2Rgb(m_pImageBuffer, m_pRawBuffer,Size.cx,Size.cy, m_ConversionType,m_pLutR,m_pLutG,m_pLutB,true,m_Layout);
}
else
{
m_pBmpInfo->bmiHeader.biBitCount = 8;
//CopyMemory(m_pImageBuffer, m_pRawBuffer, m_pBmpInfo->bmiHeader.biWidth * m_pBmpInfo->bmiHeader.biHeight);
CSize Size;
Size.cx = m_pBmpInfo->bmiHeader.biWidth;
Size.cy = m_pBmpInfo->bmiHeader.biHeight;
ConvertBayer2Rgb(m_pImageBuffer, m_pRawBuffer,Size.cx,Size.cy, m_ConversionType,m_pLutR,m_pLutG,m_pLutB,true,m_Layout);
long lImageSize = m_pBmpInfo->bmiHeader.biWidth * m_pBmpInfo->bmiHeader.biHeight;
BYTE *pTmpBit8 = new BYTE[lImageSize];
if(pTmpBit8 == NULL)
return ;
//转换成8位黑白图像
Format24To8(pTmpBit8,m_pImageBuffer, m_pBmpInfo->bmiHeader.biWidth,m_pBmpInfo->bmiHeader.biHeight);
memcpy(m_pImageBuffer,pTmpBit8,lImageSize);
if(pTmpBit8)
{
delete []pTmpBit8;
pTmpBit8 = NULL;
}
}
}
void CMainFrame::ShowImage()
{
CView *pView = NULL;
CDC *pDC = NULL;
pView = GetActiveView();
ASSERT(pView);
pDC = pView->GetDC();
ASSERT(pDC);
m_pBmpInfo->bmiHeader.biWidth = m_rcOutputWindow.Width();
m_pBmpInfo->bmiHeader.biHeight = m_rcOutputWindow.Height();
DecodeImage();
if (m_hPalette && (m_pBmpInfo->bmiHeader.biBitCount == 8)) {
m_hOldPal = ::SelectPalette(pDC->GetSafeHdc(), m_hPalette, FALSE);
::RealizePalette(pDC->GetSafeHdc());
}
//SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);
StretchDIBits(pDC->GetSafeHdc(),
0,
0,
m_pBmpInfo->bmiHeader.biWidth,
m_pBmpInfo->bmiHeader.biHeight,
0,
0,
m_pBmpInfo->bmiHeader.biWidth,
m_pBmpInfo->bmiHeader.biHeight,
m_pImageBuffer,
m_pBmpInfo,
DIB_RGB_COLORS,
SRCCOPY
);
if (m_hOldPal && (m_pBmpInfo->bmiHeader.biBitCount == 8)) {
::SelectPalette(pDC->GetSafeHdc(), m_hOldPal, FALSE);
::RealizePalette(pDC->GetSafeHdc());
}
pView->ReleaseDC(pDC);
}
BOOL CMainFrame::OpenBMPFile(LPCSTR lpFileName, BITMAPINFO *pBmpInfo, BYTE *pImageBuffer)
{
BOOL bRVal = TRUE;
DWORD dwBytesRead = 0;
DWORD dwSize = 0;
BITMAPFILEHEADER bfh;
HANDLE hFile = ::CreateFile(lpFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
bRVal = FALSE;
}
else{
dwSize = sizeof(BITMAPFILEHEADER);
::ReadFile(hFile, &bfh, dwSize, &dwBytesRead, NULL );
if (bfh.bfType != ((WORD)'M' << 8 | 'B')) {
bRVal = FALSE;
}
else{
dwSize = sizeof(BITMAPINFOHEADER);
::ReadFile(hFile, pBmpInfo, dwSize, &dwBytesRead, NULL);
if (pBmpInfo->bmiHeader.biBitCount <= 8) {
dwSize = bfh.bfOffBits - sizeof(BITMAPFILEHEADER) - sizeof(BITMAPINFOHEADER);
ReadFile(hFile,
(char *)pBmpInfo + sizeof(BITMAPINFOHEADER),
dwSize,
&dwBytesRead,
NULL
);
}
dwSize = WIDTH_BYTES(pBmpInfo->bmiHeader.biWidth * pBmpInfo->bmiHeader.biBitCount) *
pBmpInfo->bmiHeader.biHeight;
ReadFile(hFile, pImageBuffer, dwSize, &dwBytesRead, NULL);
}
CloseHandle(hFile);
}
return bRVal;
}
BOOL CMainFrame::SaveBMPFile(LPCSTR lpFileName, BITMAPINFO *pBmpInfo, BYTE *pImageBuffer)
{
BOOL bRVal = TRUE;
DWORD dwBytesRead = 0;
DWORD dwSize = 0;
BITMAPFILEHEADER bfh = {0};
int nTable = 0;
DWORD dwImageSize = 0;
if (pBmpInfo->bmiHeader.biBitCount > 8) {
nTable = 0;
}
else{
nTable = 256;
}
dwImageSize = WIDTH_BYTES(pBmpInfo->bmiHeader.biWidth * pBmpInfo->bmiHeader.biBitCount) *
pBmpInfo->bmiHeader.biHeight;
if (dwImageSize <= 0) {
bRVal = FALSE;
}
else{
bfh.bfType = (WORD)'M' << 8 | 'B';
bfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
bfh.bfSize = bfh.bfOffBits + dwImageSize;
HANDLE hFile = ::CreateFile(lpFileName,
GENERIC_WRITE ,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
bRVal = FALSE;
}
else{
dwSize = sizeof(BITMAPFILEHEADER);
::WriteFile(hFile, &bfh, dwSize, &dwBytesRead, NULL );
dwSize = sizeof(BITMAPINFOHEADER) + nTable * sizeof(RGBQUAD);
::WriteFile(hFile, pBmpInfo, dwSize, &dwBytesRead, NULL );
dwSize = dwImageSize;
WriteFile(hFile, pImageBuffer, dwSize, &dwBytesRead, NULL );
CloseHandle(hFile);
}
}
return bRVal;
}
BOOL CMainFrame::OpenRawFile(LPCSTR lpFileName, BITMAPINFO *pBmpInfo, BYTE *pRawBuffer)
{
BOOL bRVal = TRUE;
DWORD dwBytesRead = 0;
HANDLE hFile = ::CreateFile(lpFileName,
GENERIC_READ,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
bRVal = FALSE;
}
else{
::ReadFile(hFile, &(pBmpInfo->bmiHeader.biWidth), sizeof(DWORD), &dwBytesRead, NULL);
::ReadFile(hFile, &(pBmpInfo->bmiHeader.biHeight), sizeof(DWORD), &dwBytesRead, NULL);
::ReadFile(hFile, pRawBuffer, pBmpInfo->bmiHeader.biWidth * pBmpInfo->bmiHeader.biHeight, &dwBytesRead, NULL);
CloseHandle(hFile);
}
return bRVal;
}
BOOL CMainFrame::SaveRawFile(LPCSTR lpFileName, BITMAPINFO *pBmpInfo, BYTE *pRawBuffer)
{
BOOL bRVal = TRUE;
DWORD dwBytesRead = 0;
DWORD dwImageSize = 0;
dwImageSize = pBmpInfo->bmiHeader.biWidth * pBmpInfo->bmiHeader.biHeight;
if (dwImageSize <= 0) {
bRVal = FALSE;
}
else{
HANDLE hFile = ::CreateFile(lpFileName,
GENERIC_WRITE ,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);
if (hFile == INVALID_HANDLE_VALUE) {
bRVal = FALSE;
}
else{
::WriteFile(hFile, &(pBmpInfo->bmiHeader.biWidth), sizeof(DWORD), &dwBytesRead, NULL );
::WriteFile(hFile, &(pBmpInfo->bmiHeader.biHeight), sizeof(DWORD), &dwBytesRead, NULL );
::WriteFile(hFile, pRawBuffer, dwImageSize, &dwBytesRead, NULL );
CloseHandle(hFile);
}
}
return bRVal;
}
int CMainFrame::GetFileExt(LPCSTR lpFileName)
{
int nRVal = 0;
int nLength = 0;
char cFileExt[5] = {0};
nLength = strlen(lpFileName);
CopyMemory(cFileExt, (lpFileName + nLength - 4), 4);
strupr(cFileExt);
if (strcmp(cFileExt, ".BMP") == 0) {
nRVal = 0;
}
else if(strcmp(cFileExt, ".JPG") == 0){
nRVal = 1;
}
else if(strcmp(cFileExt, ".RAW") == 0){
nRVal = 2;
}
return nRVal;
}
void CMainFrame::OnFileOpenOne()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE , "*.bmp", NULL ,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY, "Bitmap Files(*.bmp)|*.bmp|JPEG Files(*.jpg)|*.jpg|MV Raw Files(*.raw)|*.raw||", this);
if (dlg.DoModal() == IDOK) {
if (m_pImageBuffer && m_pRawBuffer) {
int nFileExt = GetFileExt(dlg.GetPathName());
switch(nFileExt) {
case 0:
OpenBMPFile(dlg.GetPathName(), m_pBmpInfo, m_pImageBuffer);
break;
case 1:
HVLoadJPEG((char *)(LPCSTR)dlg.GetPathName(), m_pImageBuffer, (int *)&(m_pBmpInfo->bmiHeader.biWidth),
(int *)&(m_pBmpInfo->bmiHeader.biHeight), (int *)&(m_pBmpInfo->bmiHeader.biBitCount), TRUE);
break;
case 2:
OpenRawFile(dlg.GetPathName(), m_pBmpInfo, m_pRawBuffer);
DecodeImage();
break;
default:
break;
}
Invalidate(TRUE);
}
}
}
void CMainFrame::OnFileSaveAsOne()
{
// TODO: Add your command handler code here
CFileDialog dlg(FALSE , "*.bmp", NULL ,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY, "Bitmap Files(*.bmp)|*.bmp|JPEG Files(*.jpg)|*.jpg|MV Raw Files(*.raw)|*.raw||", this);
if (dlg.DoModal() == IDOK) {
if (m_pImageBuffer && m_pRawBuffer) {
int nFileExt = GetFileExt(dlg.GetPathName());
switch(nFileExt) {
case 0:
SaveBMPFile(dlg.GetPathName(), m_pBmpInfo, m_pImageBuffer);
break;
case 1:
HVSaveJPEG((char *)(LPCSTR)dlg.GetPathName(), m_pImageBuffer, (int)(m_pBmpInfo->bmiHeader.biWidth),
(int)(m_pBmpInfo->bmiHeader.biHeight), (int)(m_pBmpInfo->bmiHeader.biBitCount), TRUE, 100);
break;
case 2:
SaveRawFile(dlg.GetPathName(), m_pBmpInfo, m_pRawBuffer);
break;
default:
break;
}
}
}
}
void CMainFrame::OnViewWb()
{
// TODO: Add your command handler code here
CWBDlg dlg;
if (dlg.DoModal() == IDOK) {
}
}
void CMainFrame::OnUpdateViewWb(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->Enable(m_ImageMode == HV_COLOR);
}
LRESULT CMainFrame::OnGetRatioMessage(WPARAM wParam, LPARAM lParam)
{
if (m_pImageBuffer) {
if (m_ImageMode == HV_COLOR)
{
SetLutTable(1.0,1.0,1.0);
m_pBmpInfo->bmiHeader.biBitCount = 24;
CSize Size;
Size.cx = m_pBmpInfo->bmiHeader.biWidth;
Size.cy = m_pBmpInfo->bmiHeader.biHeight;
ConvertBayer2Rgb(m_pImageBuffer, m_pRawBuffer,Size.cx,Size.cy, m_ConversionType,m_pLutR,m_pLutG,m_pLutB,true,m_Layout);
GetWhiteBalanceRatio(m_pImageBuffer,
(int)m_pBmpInfo->bmiHeader.biWidth, (int)m_pBmpInfo->bmiHeader.biHeight,
&m_dRatioR, &m_dRatioG, &m_dRatioB);
}
else {
return 1;
}
}
return 1;
}
void CMainFrame::OnHelpWebsite()
{
// TODO: Add your command handler code here
// For URL, open it in the browser
HINSTANCE h = ShellExecute(NULL, "open", "http://www.Microvision.com.cn/", NULL, NULL, SW_SHOWNORMAL);
if(!((UINT)h > 32)) {
AfxMessageBox("Sorry: cannot access web location", MB_OK | MB_ICONEXCLAMATION);
}
}
void CMainFrame::OnHelpMailto()
{
// TODO: Add your command handler code here
HINSTANCE h = ShellExecute(NULL, "open", "mailto:HVDAILT Applications <support@Microvision.com.cn>", NULL, NULL, SW_SHOWNORMAL);
if(!((UINT)h > 32)) {
AfxMessageBox("Sorry: cannot access email", MB_OK | MB_ICONEXCLAMATION);
}
}
void CMainFrame::OnViewContinuation()
{
// TODO: Add your command handler code here
HVSTATUS status = HVSetSnapMode(m_hhv, CONTINUATION);
if (HV_SUCCESS(status)) {
m_SnapMode = CONTINUATION;
}
}
void CMainFrame::OnUpdateViewContinuation(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_SnapMode == CONTINUATION);
pCmdUI->Enable( ! m_bSnapping);
}
void CMainFrame::OnViewTrigger()
{
// TODO: Add your command handler code here
HVSTATUS status = HVSetSnapMode(m_hhv, TRIGGER);
if (HV_SUCCESS(status)){
m_SnapMode = TRIGGER;
}
}
void CMainFrame::OnUpdateViewTrigger(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
pCmdUI->SetCheck(m_SnapMode == TRIGGER);
pCmdUI->Enable( ! m_bSnapping);
}
void CMainFrame::OnViewSnapshot()
{
// TODO: Add your command handler code here
BYTE *ppBuff[1] ;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -