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

📄 mainfrm.cpp

📁 Led识别与统计系统,基于DELPHI 7.0下
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			}
			
		}

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