📄 snaptestdlg.cpp
字号:
}
// 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 + -