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

📄 snaptestdlg.cpp

📁 有关数字图像处理的一些源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	}
//	bSnapEnd = TRUE;
//	bPrewEnd = FALSE;
}

void CSnapTestDlg::OnSnap() 
{
//	bSnapStart = TRUE;
//	bPrewEnd = TRUE;
	Stop();
	Close();
	//创建连续拍摄线程
	hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ContinueSnap,NULL,0,&ThreadID);
//	bSnapEnd = TRUE;

}

void CSnapTestDlg::OnStop() 
{
//	bSnapStart = FALSE;
	CloseHandle(hThread); //关闭线程
}

void CSnapTestDlg::OnLevel0() 
{
	//改变ADC级别
	HVADCControl(m_hHV, ADC_BITS, ADC_LEVEL0);	
}

void CSnapTestDlg::OnLevel1() 
{
	HVADCControl(m_hHV, ADC_BITS, ADC_LEVEL1);	
}

void CSnapTestDlg::OnLevel2() 
{
	HVADCControl(m_hHV, ADC_BITS, ADC_LEVEL2);	
}

void CSnapTestDlg::OnLevel3() 
{
	HVADCControl(m_hHV, ADC_BITS, ADC_LEVEL3);	
}


void CSnapTestDlg::OnMode0() 
{

	Stop();
	Close();
	Width  = 2048;
	Height = 1536;
//	Resolution = RES_MODE0;
//	HVSetResolution(m_hHV,Resolution);
//	HVSetSnapMode(m_hHV, SnapMode);
	HVSetOutputWindow(m_hHV,XStart,YStart,Width,Height);
	SetExposureTime(Width,ExposureTint_Upper,ExposureTint_Lower);
	m_pBmpInfo ->bmiHeader.biWidth = Width;
	m_pBmpInfo ->bmiHeader.biHeight = Height;
	Open();
	Start();

}

void CSnapTestDlg::OnMode1() 
{

	Stop();
	Close();
	Width  = 1024;
	Height = 768;
//	Resolution = RES_MODE1;
//	HVSetResolution(m_hHV,Resolution);
//	HVSetSnapMode(m_hHV, SnapMode);
	HVSetOutputWindow(m_hHV,XStart,YStart,Width,Height);
	SetExposureTime(Width,ExposureTint_Upper,ExposureTint_Lower);
	m_pBmpInfo ->bmiHeader.biWidth = Width;
	m_pBmpInfo ->bmiHeader.biHeight = Height;
	Open();
	Start();

}

void CSnapTestDlg::OnMode2() 
{

	Stop();
	Close();
	Width  = 640;
	Height = 480;
//	Resolution = RES_MODE2;
//	HVSetResolution(m_hHV,Resolution);
//	HVSetSnapMode(m_hHV, SnapMode);
	HVSetOutputWindow(m_hHV,XStart,YStart,Width,Height);
	SetExposureTime(Width,ExposureTint_Upper,ExposureTint_Lower);
	m_pBmpInfo ->bmiHeader.biWidth = Width;
	m_pBmpInfo ->bmiHeader.biHeight = Height;
	Open();
	Start();

}

//初始化摄像机采集图象到内存
void CSnapTestDlg::Open()
{
	HVSTATUS status = STATUS_OK;

	/*
	 *	初始化数字摄像机采集图像到内存的控制,
	 *	指定回调函数SnapThreadCallback和用户参数m_hWnd
	 */
	status = HVOpenSnap(m_hHV, SnapThreadCallback, m_hWnd);					
	HV_VERIFY(status);
	if (HV_SUCCESS(status))
	{
		bOpen = TRUE;		//标志已经打开SnapEx环境
	}
}


int CALLBACK CSnapTestDlg::SnapThreadCallback(HV_SNAP_INFO *pInfo)
{
	HWND hwnd = (HWND)(pInfo->pParam);
			
	/*
	 *	发送自定义消息WM_SNAP_EX_CHANGE到主窗口,	
	 *	同时传入当前可以处理的图像序号
	 *	注意:用SendMessage发送消息,必须等待消息处理完毕后,才能退出整个SendMessage函数
	 */
	::SendMessage(hwnd, WM_SNAP_CHANGE, 0, 0);
	return 1;
}

void CSnapTestDlg::OnSingle() 
{
	bSingleSnap = TRUE;//单张拍摄变量设置为真
}

LRESULT CSnapTestDlg::OnSnapChange(WPARAM wParam, LPARAM lParam)
{
	HVSTATUS status = STATUS_OK;
	CDC *pDC	= GetDC();
    //源缓冲区Bayer格式数据转化为目的缓冲区RGB格式
	ConvertBayer2Rgb(m_ImageBuffer[0],m_pRawBuffer[0],Width,Height,ConvertType,m_pLutR,m_pLutG,m_pLutB,true,Layout);
//	ConvertBayer2Rgb(m_pImageBuffer2,m_pRawBuffer2,Width,Height,ConvertType,m_pLutR,m_pLutG,m_pLutB,true,Layout);
//	ConvertBayer2Rgb(m_pImageBuffer3,m_pRawBuffer3,Width,Height,ConvertType,m_pLutR,m_pLutG,m_pLutB,true,Layout);
//	ConvertBayer2Rgb(m_pImageBuffer4,m_pRawBuffer4,Width,Height,ConvertType,m_pLutR,m_pLutG,m_pLutB,true,Layout);
//	ConvertBayer2Rgb(m_pImageBuffer5,m_pRawBuffer5,Width,Height,ConvertType,m_pLutR,m_pLutG,m_pLutB,true,Layout);
//	ConvertBayer2Rgb(m_pImageBuffer6,m_pRawBuffer6,Width,Height,ConvertType,m_pLutR,m_pLutG,m_pLutB,true,Layout);

	SetStretchBltMode(pDC->GetSafeHdc(),COLORONCOLOR);

	
	//在视图客户区显示图像
	//1
	StretchDIBits(pDC->GetSafeHdc(),
		ShowRect.left,
		ShowRect.top,
		ShowRect.Width(),
		ShowRect.Height(),
		0,
		0,
		Width,
		Height,
		m_ImageBuffer[0],//图像缓冲区
		m_pBmpInfo,	//BMP图像描述信息
		DIB_RGB_COLORS,
		SRCCOPY
		);
	
	
	
	CWnd* pWnd = GetDlgItem(IDC_SHOW);
	CDC* pdc = pWnd->GetDC(); 
	pWnd->GetClientRect(&m_rc);

	CPen pen(PS_DOT, 1, RGB(255, 255, 255)); 
	CPen *pOldPen = pdc->SelectObject(&pen);  

	//去除背景
	pdc->SetBkMode(TRANSPARENT); 
	
    pdc->MoveTo(m_rc.left + m_rc.Width()/2,m_rc.top);
	pdc->LineTo(m_rc.left + m_rc.Width()/2,m_rc.bottom);
	pdc->MoveTo(m_rc.left,m_rc.Height()/2 + m_rc.top);
	pdc->LineTo(m_rc.right,m_rc.Height()/2 + m_rc.top);
	
	pdc->SelectObject(pOldPen);
	
	pdc->DeleteDC();

  

	if( bSingleSnap )
	{
		
		BITMAPFILEHEADER bfh	= {0};
		DWORD dwImageSize	= 0;
		DWORD dwBytesRead	= 0;
		
		if(bBMP == TRUE)
		{
			dwImageSize		=  Width * Height * 3;	//计算图像大小,由视频输出窗口和视频格式确定
			bfh.bfType		= (WORD)'M' << 8 | 'B';	//定义文件类型
			bfh.bfOffBits		= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);	//定义文件头大小
			bfh.bfSize		= bfh.bfOffBits + dwImageSize;//文件大小
		
			//文件名
			CTime time;
			time = CTime::GetCurrentTime();
			CString str = time.Format("%H-%M-%S");
			str = strPath + str + ".bmp";
		
//		str.Format("%s-%d.bmp",str,nCount);
			HANDLE hFile = ::CreateFile(str,GENERIC_WRITE ,	0,NULL,	CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
			if (hFile == INVALID_HANDLE_VALUE)
			{
			//MessageBox("不可用的文件句柄!","保存单张图片失败!",MB_OK);
				CreateDirectory(strPath,NULL);

				CString str = time.Format("%H-%M-%S");
				str = strPath + str + ".bmp";
				HANDLE hFile = ::CreateFile(str,GENERIC_WRITE ,	0,NULL,	CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );

				::WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL );
				::WriteFile(hFile, m_pBmpInfo, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL );
				::WriteFile(hFile, m_ImageBuffer[0], dwImageSize, &dwBytesRead, NULL );


			}
			else
			{
				::WriteFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL );
				::WriteFile(hFile, m_pBmpInfo, sizeof(BITMAPINFOHEADER), &dwBytesRead, NULL );
				::WriteFile(hFile, m_ImageBuffer[0], dwImageSize, &dwBytesRead, NULL );
				
				CloseHandle(hFile);
			}
			bSingleSnap = FALSE;
		}
		if(bRAW == TRUE)
		{
			dwImageSize		=  Width * Height;	//计算图像大小,由视频输出窗口和视频格式确定
			bfh.bfType		= (WORD)'M' << 8 | 'B';	//定义文件类型
			bfh.bfOffBits		= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);	//定义文件头大小
			bfh.bfSize		= bfh.bfOffBits + dwImageSize;//文件大小

			CTime time;
			time = CTime::GetCurrentTime();
			str = time.Format("%H-%M-%S");
			str = strPath + str+ ".raw";
		//	str.Format("%s-%d.raw",str, i);

			hFile = ::CreateFile(str,GENERIC_WRITE ,0,NULL,	CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
			if (hFile == INVALID_HANDLE_VALUE)
			{
				//MessageBox("不可用的文件句柄!","保存单张图片失败!",MB_OK);
				CreateDirectory(strPath,NULL);
				str = time.Format("%H-%M-%S");
				str = strPath + str+ ".raw";
				::WriteFile(hFile, &(m_pBmpInfo->bmiHeader.biWidth), sizeof(DWORD), &dwBytesRead, NULL );
				::WriteFile(hFile, &(m_pBmpInfo->bmiHeader.biHeight), sizeof(DWORD), &dwBytesRead, NULL );
				::WriteFile(hFile, m_pRawBuffer[0], dwImageSize, &dwBytesRead, NULL );

			}
			else
			{
				::WriteFile(hFile, &(m_pBmpInfo->bmiHeader.biWidth), sizeof(DWORD), &dwBytesRead, NULL );
				::WriteFile(hFile, &(m_pBmpInfo->bmiHeader.biHeight), sizeof(DWORD), &dwBytesRead, NULL );
				::WriteFile(hFile, m_pRawBuffer[0], dwImageSize, &dwBytesRead, NULL );
			}
			CloseHandle(hFile);
			bSingleSnap = FALSE;

		}
	}
	pDC->DeleteDC();


	return 1;
}

//开始摄像机循环采集图象到内存
void CSnapTestDlg::Start()
{
	HVSTATUS status = STATUS_OK;

	/*
	 *	启动数字摄像机循环采集图像到内存
	 */
	BYTE *ppBuf[1];
	ppBuf[0] = m_pRawBuffer[0];
	
	status = HVStartSnap(m_hHV, ppBuf,1);
	HV_VERIFY(status);
	if (HV_SUCCESS(status))
	{
		bStart = TRUE;
	}
}

void CSnapTestDlg::Stop() 
{
	HVSTATUS status = STATUS_OK;
	
	//	停止采集图像到内存,可以再次调用HVStartSnapEx启动数字摄像机采集
	status = HVStopSnap(m_hHV);
	HV_VERIFY(status);
	if (HV_SUCCESS(status)) 
	{
		bStart = FALSE;
	}
}

void CSnapTestDlg::Close() 
{
	HVSTATUS status = STATUS_OK;

	/*
	 *	终止数字摄像机采集图像到内存,同时释放所有采集环境,
	 *	再次启动数字摄像机采集,必须重新初始化	
	 */
	status = HVCloseSnap(m_hHV);
	HV_VERIFY(status);

	if (HV_SUCCESS(status))
	{
		bOpen	= FALSE;
		bStart	= FALSE;
	}
}

BOOL CSnapTestDlg::DestroyWindow() 
{
	for(int i = 0 ;i < 36 ; i++)
	{
		delete m_pRawBuffer[i];
		delete m_ImageBuffer[i];
	}
//	KillTimer(1);
	Stop();
	Close();
	EndHVDevice(m_hHV);
	
	return CDialog::DestroyWindow();
}
//保存设置函数
void CSnapTestDlg::OnSave() 
{
	CSaveDlg SaveDlg;
	char szFormat[20];
	if(SaveDlg.DoModal() == IDOK)
	{
		strPath = SaveDlg.m_SelectPath;
		ReadString("Format",szFormat,sizeof(szFormat),APP_PATH);
		if( strcmp(szFormat,"RAW") == 0 )
		{
			dwImageSize =  Width * Height;//计算图像大小,由视频输出窗口和视频格式确定
			bRAW = TRUE;
			bBMP = FALSE;
		}
		else if( strcmp(szFormat,"BMP") == 0 )
		{
			dwImageSize =  Width * Height * 3;//计算图像大小,由视频输出窗口和视频格式确定
			bBMP = TRUE;
			bRAW = FALSE;
		}
	}
}
//设置曝光按钮对应函数
void CSnapTestDlg::OnExposure() 
{
	CExposureDlg ExposureDlg;
	if(ExposureDlg.DoModal() == IDOK )
	{
		ExposureTint_Lower = atol(ExposureDlg.m_ExposureTime);
		SetExposureTime(Width,ExposureTint_Upper,ExposureTint_Lower);
	}
}

/*
void CSnapTestDlg::OnTimer(UINT nIDEvent) 
{
	if(bSnapStart == TRUE)
	{
		Stop();
		Close();
		bSnapStart = FALSE;
	}

	if(bSnapEnd == TRUE)
	{
		Open();
		Start();
		bSnapEnd = FALSE;
	}
	CDialog::OnTimer(nIDEvent);
}
*/
//预览函数
void CSnapTestDlg::OnPreview() 
{
	Open();
	Start();
}

void CSnapTestDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CWnd *pwnd = GetDlgItem(IDC_SHOW);
	pwnd->GetClientRect(&m_Rect);

	//坐标换算为客户区
	pwnd->GetWindowRect(&m_Rect);
	ScreenToClient(&m_Rect);
	
	if (m_Rect.PtInRect(point))
	{
		::SetCursor(::LoadCursor(NULL,IDC_CROSS));
	}

		
	CDialog::OnMouseMove(nFlags, point);
}

void CSnapTestDlg::OnCcdstartButton() 
{
	// TODO: Add your control notification handler code here



	//-------------------------------------------------------
	//打开数字摄像机 1
	HVSTATUS status = BeginHVDevice(1, &m_hHV);//BeginHVDevice函数的定义在动态连接库HVDAILT.DLLA中
	//	检验函数执行状态,如果失败,则返回错误状态消息框
	HV_VERIFY(status);
	

	/////////////////////////////////////////////////////////////////////////
	/*
	*	初始化数字摄像机硬件状态,用户也可以在其他位置初始化数字摄像机,
	*	但应保证数字摄像机已经打开,建议用户在应用程序初始化时,
	*	同时初始化数字摄像机硬件。
	*/
	
	//	设置数字摄像机分辨率
	HVSetResolution(m_hHV, Resolution);		
	
	//	采集模式,包括 CONTINUATION(连续)、TRIGGER(外触发)
	HVSetSnapMode(m_hHV, SnapMode);
	
	//  设置各个分量的增益 ,摄像机的颜色通道
	for (int i = 0; i < 4; i++)
	{
		HVAGCControl(m_hHV, RED_CHANNEL + i, Gain);
	}
	
	//设置曝光时间
//	CString strExposureLower;  
	char szTemp[20];
	ReadString("Lower",szTemp,sizeof(szTemp),APP_PATH);
	
//	strExposureLower = pchExposureLower;
	ExposureTint_Lower = atol(szTemp);
	SetExposureTime(Width,ExposureTint_Upper,ExposureTint_Lower);	
	
	//设置ADC的级别
	HVADCControl(m_hHV, ADC_BITS, ADCLevel);

	
	/*
	*	视频输出窗口,即视频输出范围,输出窗口取值范围必须在输入窗口范围以内,
	*  视频窗口左上角X坐标和窗口宽度应为4的倍数,左上角Y坐标和窗口高度应为2的倍数
	*	输出窗口的起始位置一般设置为(0, 0)即可。
	*/
	HVSetOutputWindow(m_hHV, XStart, YStart, Width, Height);
	
	//	m_pBmpInfo即指向m_chBmpBuf缓冲区,用户可以自己分配BTIMAPINFO缓冲区	
	m_pBmpInfo = (BITMAPINFO *)m_chBmpBuf;
	//	初始化BITMAPINFO 结构,此结构在保存bmp文件、显示采集图像时使用
	m_pBmpInfo->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
	//	图像宽度,一般为输出窗口宽度
	m_pBmpInfo->bmiHeader.biWidth	= Width;
	//	图像宽度,一般为输出窗口高度
	m_pBmpInfo->bmiHeader.biHeight	= Height;
	
	/*
	*	以下设置一般相同,
	*	对于低于8位的位图,还应设置相应的位图调色板
	*/
	m_pBmpInfo->bmiHeader.biPlanes		= 1;
	m_pBmpInfo->bmiHeader.biBitCount	= 24;
	m_pBmpInfo->bmiHeader.biCompression	= BI_RGB;
	m_pBmpInfo->bmiHeader.biSizeImage	= 0;
	m_pBmpInfo->bmiHeader.biXPelsPerMeter	= 0;
	m_pBmpInfo->bmiHeader.biYPelsPerMeter	= 0;
	m_pBmpInfo->bmiHeader.biClrUsed		= 0;
	m_pBmpInfo->bmiHeader.biClrImportant	= 0;

	//-------------------------------------------------------
	
	//文件结构头
	bfh.bfType		= (WORD)'M' << 8 | 'B';	
	bfh.bfOffBits		= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);	
	bfh.bfSize		= bfh.bfOffBits + dwImageSize;

	//得到显示区域大小
	GetDlgItem(IDC_SHOW)->GetWindowRect(&ShowRect);
	ScreenToClient(&ShowRect);
	
	bOpen = FALSE;
	bStart = FALSE;
	bSingleSnap = FALSE;
	
	//设置图片格式
	char szFormat[20];
	ReadString("Format",szFormat,sizeof(szFormat),APP_PATH);
	if( strcmp(szFormat,"RAW") == 0 )
	{
		dwImageSize =  Width * Height;//计算图像大小,由视频输出窗口和视频格式确定
		bRAW = TRUE;
		bBMP = FALSE;
	}
	else if( strcmp(szFormat,"BMP") == 0 )
	{
		dwImageSize =  Width * Height * 3;//计算图像大小,由视频输出窗口和视频格式确定
		bBMP = TRUE;
		bRAW = FALSE;
	}
	
	//设置图片保存路径
	char szPath[30];
	ReadString("Path",szPath,sizeof(szFormat),APP_PATH);
	strPath = szPath;
	
	Open();
	Start();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -