imageobjectdlg.cpp
来自「实时视频捕获」· C++ 代码 · 共 1,641 行 · 第 1/4 页
CPP
1,641 行
}
}
Invalidate();
}
void CImageObjectDlg::OnCbnSelchangeComboSelectRegion()
{
// TODO: Add your control notification handler code here
int index=m_SelectDetectRegion.GetCurSel();
CString str;
str.Format(_T("%d"),m_SysSetPara.dtr[index].region.Height());
this->m_SetDetectRegionHeight.SetWindowText(str);
str.Format(_T("%d"),m_SysSetPara.dtr[index].region.Width());
this->m_SetDetectRegionWidth.SetWindowText(str);
str.Format(_T("%d"),m_SysSetPara.dtr[index].threshold);
this->m_SetDetectThreshold.SetWindowText(str);
m_iCurrentDetectRegionID=index;
this->Invalidate();
}
void CImageObjectDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
// TODO: Add your message handler code here and/or call default
int pos;
HRESULT hr;
VIDEOPROPERTYRANGE vpr;
if(pScrollBar->m_hWnd == m_ImageContrastSlider.m_hWnd)
{
pos = m_ImageContrastSlider.GetPos();
DSStream_SetVideoPropertyValue(m_CardID, VideoProperty_Brightness, pos*100);
hr = DSStream_GetVideoPropertyValue(m_CardID, VideoProperty_Brightness, &vpr);
m_SysSetPara.image_contrast=pos;
}else if(pScrollBar->m_hWnd == m_ImageLightSlider.m_hWnd)
{
pos = m_ImageLightSlider.GetPos();
DSStream_SetVideoPropertyValue(m_CardID, VideoProperty_Brightness, pos*100);
hr = DSStream_GetVideoPropertyValue(m_CardID, VideoProperty_Brightness, &vpr);
m_SysSetPara.image_light=pos;
}
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void CImageObjectDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
// this->m_ShowImage.OnLButtonDown(nFlags, point);
/* CRect rectImage;
m_ShowImage.GetWindowRect(rectImage);
CRect reDetectRegionOnScreen;
CPoint mypoint(0,0);
m_ShowImage.ClientToScreen(&mypoint);
this->ScreenToClient(&mypoint);
*/
for(int i=0;i<m_SysSetPara.detect_num;i++)
{
CPoint convertP=point;
ClientToScreen(&convertP);
m_ShowImage.ScreenToClient(&convertP);
if(DetectRegion[i].PtInRect(convertP))
{
m_iCurrentDetectRegionID=i;
if(m_SetEnable)
{
m_SelectDetectRegion.SetCurSel(i);
CString str;
m_SelectDetectRegion.SetCurSel(m_iCurrentDetectRegionID);
str.Format(_T("%d"),m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.Height());
m_SetDetectRegionHeight.SetWindowText(str);
str.Format(_T("%d"),m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.Width());
m_SetDetectRegionWidth.SetWindowText(str);
str.Format(_T("%d"),m_SysSetPara.dtr[m_iCurrentDetectRegionID].threshold);
m_SetDetectThreshold.SetWindowText(str);
long l,t,r,b;
l=convertP.x;
t=convertP.y;
r=convertP.x+DetectRegion[i].Width();
b=convertP.y+DetectRegion[i].Height();
DetectRegion[m_iCurrentDetectRegionID]=CRect(l,t,r,b);
m_StartPoint=convertP;
m_LasterPoint=convertP;
m_RegionPosiAdjust=TRUE;
}
this->Invalidate();
}
}
/*
CRect rtRegion=m_SysSetPara.dtr[i].region;
m_ShowImage.ClientToScreen(rtRegion);
this->ScreenToClient(rtRegion);
DetectRegion[i]=rtRegion;
if(!m_bufferVideo)
{
m_bufferVideo=new BYTE[100];
}
if(m_SetEnable)
{
if(rectImage.PtInRect(point))
{
if(DetectRegion[m_iCurrentDetectRegionID].PtInRect(point))
{
m_RegionPosiAdjust=TRUE;
SetCapture();
m_StartPoint=point;
}
}
}else
{
if(rectImage.PtInRect(point))
{
for(int i=0;i<m_SysSetPara.detect_num;i++)
{
if(DetectRegion[i].PtInRect(point))
{
m_iCurrentDetectRegionID=i;
}
}
}
}
*/
CDialog::OnLButtonDown(nFlags, point);
}
void CImageObjectDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if(m_SetEnable)
{
if(m_RegionPosiAdjust)
{
CPoint convertP=point;
ClientToScreen(&convertP);
m_ShowImage.ScreenToClient(&convertP);
CRect region;
m_ShowImage.GetWindowRect(region);
m_ShowImage.ScreenToClient(region);
long l,t,r,b;
l=0;
t=0;
r=region.Width()-DetectRegion[m_iCurrentDetectRegionID].Width();
b=region.Height()-DetectRegion[m_iCurrentDetectRegionID].Height();
region=CRect(l,t,r,b);
if(region.PtInRect(convertP))
{
DetectRegion[m_iCurrentDetectRegionID].MoveToXY(convertP);
m_SysSetPara.dtr[m_iCurrentDetectRegionID].region=DetectRegion[m_iCurrentDetectRegionID];
m_RegionPosiAdjust=FALSE;
}else
{
m_RegionPosiAdjust=FALSE;
DetectRegion[m_iCurrentDetectRegionID]=m_SysSetPara.dtr[m_iCurrentDetectRegionID].region;
}
this->Invalidate();
}
}
CDialog::OnLButtonUp(nFlags, point);
}
void CImageObjectDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
/* CRect rectImage;
m_ShowImage.GetWindowRect(rectImage);
CRect reDetectRegionOnScreen;
CPoint mypoint(0,0);
m_ShowImage.ClientToScreen(&mypoint);
this->ScreenToClient(&mypoint);
*/
if(m_SetEnable)
{
if(m_RegionPosiAdjust)
{
CPoint convertP=point;
ClientToScreen(&convertP);
m_ShowImage.ScreenToClient(&convertP);
CRect region;
m_ShowImage.GetWindowRect(region);
m_ShowImage.ScreenToClient(region);
long l,t,r,b;
l=0;
t=0;
r=region.Width()-DetectRegion[m_iCurrentDetectRegionID].Width();
b=region.Height()-DetectRegion[m_iCurrentDetectRegionID].Height();
region=CRect(l,t,r,b);
if(region.PtInRect(convertP))
{
DetectRegion[m_iCurrentDetectRegionID].MoveToXY(convertP);
}else
{
m_RegionPosiAdjust=FALSE;
DetectRegion[m_iCurrentDetectRegionID]=m_SysSetPara.dtr[m_iCurrentDetectRegionID].region;
}
this->Invalidate();
}
}
CDialog::OnMouseMove(nFlags, point);
}
void CImageObjectDlg::RectImageToDlg(CRect *lpSource,CRect *lpResult)
{
// int value;
double scale;
CRect reShow;
m_ShowImage.GetWindowRect(reShow);
scale=lpSource->top/IMAGE_HEIGHT;
lpResult->top=(long)(reShow.top+reShow.Height()*scale);
lpResult->bottom=(long)(reShow.bottom+reShow.Height()*scale);
scale=lpSource->left/IMAGE_WIDTH;
lpResult->left=(long)(reShow.left+reShow.Width()*scale);
lpResult->right=(long)(reShow.right+reShow.Width()*scale);
}
void CImageObjectDlg::RectDlgToImage(CRect *lpSource,CRect *lpResult)
{
// int value;
double scale;
CRect reShow;
m_ShowImage.GetWindowRect(reShow);
scale=lpSource->top/IMAGE_HEIGHT;
lpResult->top=(long)(reShow.top+reShow.Height()*scale);
lpResult->bottom=(long)(reShow.bottom+reShow.Height()*scale);
scale=lpSource->left/IMAGE_WIDTH;
lpResult->left=(long)(reShow.left+reShow.Width()*scale);
lpResult->right=(long)(reShow.right+reShow.Width()*scale);
}
void CImageObjectDlg::OnEnKillfocusRe2RegionHeight()
{
// TODO: Add your control notification handler code here
int end=m_SetDetectRegionHeight.GetTextLength();
CString str;
m_SetDetectRegionHeight.GetTextRange(0,end,str);
char buffer[20];
for(int i=0;i<end;i++)
{
buffer[i]=((BYTE*)str.GetBuffer())[i];
}
int h=atoi(buffer);
if((h<MAX_REGION_HEIGHT)&&(h>5))
{
m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.bottom=m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.top+h;
this->DetectRegion[m_iCurrentDetectRegionID].bottom=DetectRegion[m_iCurrentDetectRegionID].top+h;
this->Invalidate();
}else
{
m_SetDetectRegionHeight.Clear();
}
}
void CImageObjectDlg::OnEnKillfocusRe2RegionWidth()
{
// TODO: Add your control notification handler code here
int end=m_SetDetectRegionWidth.GetTextLength();
CString str;
m_SetDetectRegionWidth.GetTextRange(0,end,str);
char buffer[20];
for(int i=0;i<end;i++)
{
buffer[i]=((BYTE*)str.GetBuffer())[i];
}
int w=atoi(buffer);
if((w<MAX_REGION_WIDTH)&&(w>5))
{
m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.right=m_SysSetPara.dtr[m_iCurrentDetectRegionID].region.left +w;
this->DetectRegion[m_iCurrentDetectRegionID].right=DetectRegion[m_iCurrentDetectRegionID].left+w;
this->Invalidate();
}else
{
m_SetDetectRegionWidth.Clear();
}
}
void CImageObjectDlg::OnEnKillfocusRe2RegionThreshold()
{
// TODO: Add your control notification handler code here
int end=m_SetDetectThreshold.GetTextLength();
CString str;
m_SetDetectThreshold.GetTextRange(0,end,str);
int w=_ttoi(str);
if((w<250)&&(w>30))
{
m_SysSetPara.dtr[m_iCurrentDetectRegionID].threshold=w;
}else
{
m_SetDetectThreshold.Clear();
}
}
void CImageObjectDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
if(nIDEvent==GET_IMAGE_EVENT)
{
long k=1244160;
HRESULT hr;
BYTE *buffer=new BYTE[1244200];
if(!m_lpShowVideoWnd->GetDIBImage(buffer))
{
long size;
hr = DSStream_GetCurrentDib(m_CardID,NULL,&size);
if(SUCCEEDED(hr)&&(size=1244200))
{
hr =DSStream_GetCurrentDib(m_CardID,(BYTE*)buffer,&size);
if(FAILED(hr)&&(size!=1244200))
{
return ;
}
}else
{
return;
}
}
// memcpy(m_lpbmiVideo,buffer,40);
m_bufferVideo=(BYTE*)&buffer[40];
CClientDC dc(FromHandle(m_ShowImage.m_hWnd ));//this
SetDIBits(dc.m_hDC,(HBITMAP)m_bmpMain.m_hObject,0,576,m_bufferVideo,m_lpbmiVideo,DIB_RGB_COLORS);
m_bufferVideo=new BYTE[1244200];
m_bmpMain.GetBitmapBits(1244160,(void*)m_bufferVideo);
GetRegionImageData();
for(int i=0;i<m_SysSetPara.detect_num;i++)
{
RegionImageProcess(i);
}
DisplayResult();
delete []m_bufferVideo;
delete []buffer;
}
CDialog::OnTimer(nIDEvent);
}
/*
long k=1244160;
HRESULT hr;
BYTE *buffer=new BYTE[1244200];
m_lpShowVideoWnd->GetDIBImage(buffer);
memcpy(m_lpbmiVideo,buffer,40);
// memcpy(m_bufferVideo,(buffer+40),1244160);
m_bufferVideo=(BYTE*)&buffer[40];
BOOL Create;
BOOL ret;
CDC memDC;
CClientDC dc(FromHandle(m_ShowImage.m_hWnd ));//this
Create=memDC.CreateCompatibleDC( &dc);
CBitmap temp;
// temp.CreateBitmap(IMAGE_WIDTH,IMAGE_HEIGHT,1,24,NULL);//(void*)m_bufferVideo
// Create=m_bmpMain.DeleteObject();
// Create=m_bmpMain.CreateBitmap(IMAGE_WIDTH,IMAGE_HEIGHT,1,24,(void*)m_bufferVideo);//(void*)m_bufferVideo
// long numbyte=m_bmpMain.SetBitmapBits(m_lpbmiVideo->bmiHeader.biSizeImage,m_bufferVideo);
/* HBITMAP hnewbmp=CreateDIBSection(dc.m_hDC , // handle to DC
m_lpbmiVideo, // bitmap data
DIB_RGB_COLORS, // data type indicator
0, // bit values
NULL, // handle to file mapping object
0 // offset to bitmap bit values
);
temp.DeleteObject();
ret=temp.Attach((HGDIOBJ)hnewbmp);
*/
// SetDIBits(dc.m_hDC,(HBITMAP)m_bmpMain.m_hObject,0,576,m_bufferVideo,m_lpbmiVideo,DIB_RGB_COLORS);
// k=temp.SetBitmapBits(1244160,m_bufferVideo);
// CBitmap* pbmpOld = memDC.SelectObject(&temp );//CBitmap::FromHandle((HBITMAP)temp.m_hObject)
// memDC.SelectObject( &temp);//CBitmap::FromHandle((HBITMAP)m_bmpMain.m_hObject)
// Create=dc.StretchBlt(0,0,IMAGE_WIDTH,IMAGE_HEIGHT,&memDC,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,SRCCOPY);
// memDC.SelectObject( &m_bmpMain);//CBitmap::FromHandle((HBITMAP)m_bmpMain.m_hObject)
// Create=dc.StretchBlt(0,0,IMAGE_WIDTH,IMAGE_HEIGHT,&memDC,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,SRCCOPY);
// CClientDC dc(this);//FromHandle(m_ShowImage.m_hWnd)m_bufferVideo
// k=::StretchDIBits(dc.m_hDC,0 ,0 ,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,m_lpbmiVideo->bmiHeader.biWidth,m_lpbmiVideo->bmiHeader.biHeight,(VOID *)m_bufferVideo,m_lpbmiVideo,DIB_RGB_COLORS,SRCCOPY);
// ImageProcess(0,0);
// GetRegionImageData();
// for(int i=0;i<m_SysSetPara.detect_num;i++)
// {
// RegionImageProcess(i);
// }
// DisplayResult();
// delete []buffer;
void CImageObjectDlg::OnBnClickedButtonDebug()
{
// TODO: Add your control notification handler code here
// DSStream_DisplayPropertyDialogs( m_CardID, PropertyDlg_VideoPreviewPin, this->m_hWnd,NULL);
long size;
HRESULT hr = DSStream_GetCurrentDib(m_CardID,NULL,&size);
// hr =DSStream_GetCurrentDib(0,NULL,&size);
if(SUCCEEDED(hr)&&(size=1244200))
{
// ::AfxMessageBox("snap ok");
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?