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

📄 mainfrm.cpp

📁 Led识别与统计系统,基于DELPHI 7.0下
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	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 + -