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

📄 capturewnd.cpp

📁 基于视觉的道路识别技术的智能小车导航源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include "capturewnd.h"
#include  <math.h>
#include <TIME.H>
#include "HSI.h"
//定义一个枚举类型
enum CAPTURESET{VideoFormat,VideoDisplay,VidoeSource,VideoCompression};
LRESULT CALLBACK CCaptureWnd::CallBackOnFrameForAlign(HWND h_Wnd,VIDEOHDR *lpVHDR)
{
	BITMAPINFO *lpBmp;
      DWORD VideoFormatSize;
	  DWORD nWidth;
      DWORD nHeight;
      WORD  bitsCount;
      LPBYTE lpImage;
      DWORD x;     
	  DWORD y;
	  DWORD nXpos;
	  DWORD nYpos;
	//------------------------------------
	
	VideoFormatSize=capGetVideoFormatSize(h_Wnd);
	lpBmp=(BITMAPINFO *)new unsigned char[VideoFormatSize];
	capGetVideoFormat(h_Wnd,lpBmp,VideoFormatSize);
	nWidth=(lpBmp->bmiHeader).biWidth;
    nHeight=lpBmp->bmiHeader.biHeight;
	bitsCount=lpBmp->bmiHeader.biBitCount;
	if(bitsCount!=24||lpBmp->bmiHeader.biCompression!=BI_RGB) 
	{
		capSetCallbackOnFrame(h_Wnd,NULL);
		AfxMessageBox("视频格式设定不正确!!\n\n  请设为RGB 24");
		
			return FALSE;
	}
	//------------------------------------
	lpImage=lpVHDR->lpData;
	

      DWORD XandY=(DWORD)capGetUserData(h_Wnd);
      nXpos=LOWORD(XandY);
	  nYpos=HIWORD(XandY);
     
      nYpos=nHeight-1-nYpos;

    //定位到实际像素点存放每一行像素点临时计算结果
    for(  x=0;x<nWidth;x++)
	{
		 if((x%10)<5)
		 {
	        lpImage[3*nWidth*nYpos+3*x]=0;//B
		    lpImage[3*nWidth*nYpos+3*x+1]=0;//G
		    lpImage[3*nWidth*nYpos+3*x+2]=255;//R
		}
		  
	 }
	for(  y=0;y<nHeight;y++)
	{
		 if((y%10)<5)
		 {
	        lpImage[3*nWidth*y+3*nXpos]=0;//B
		    lpImage[3*nWidth*y+3*nXpos+1]=0;//G
		    lpImage[3*nWidth*y+3*nXpos+2]=255;//R
		}
	 
	 }
return TRUE;
}

LRESULT CALLBACK CCaptureWnd::CallBackOnFrameForRoute(HWND h_Wnd,VIDEOHDR *lpVHDR)
{
	BITMAPINFO *lpBmp;
      DWORD VideoFormatSize;
	  DWORD nWidth;
      DWORD nHeight;
      WORD  bitsCount;
      LPBYTE lpImage;
      
	//------------------------------------
	
	VideoFormatSize=capGetVideoFormatSize(h_Wnd);
	lpBmp=(BITMAPINFO *)new unsigned char[VideoFormatSize];
	capGetVideoFormat(h_Wnd,lpBmp,VideoFormatSize);
	nWidth=(lpBmp->bmiHeader).biWidth;
    nHeight=lpBmp->bmiHeader.biHeight;
	bitsCount=lpBmp->bmiHeader.biBitCount;
	if(bitsCount!=24||lpBmp->bmiHeader.biCompression!=BI_RGB) 
	{
		capSetCallbackOnFrame(h_Wnd,NULL);
		AfxMessageBox("视频格式设定不正确!!\n\n  请设为RGB 24");
		
			return FALSE;
	}
	//------------------------------------
	lpImage=lpVHDR->lpData;
    
	
	
	DWORD time=lpVHDR->dwTimeCaptured;

	
	
	
//	AfxGetApp()->m_pMainWnd->PostMessage(WM_MEASUREDATA,time, 0) ;

	
    
return TRUE;
}
 
CCaptureWnd::CCaptureWnd(void)
{
	m_hCapWnd=NULL;
    //szPath="VFW.avi";
	
	
}

CCaptureWnd::~CCaptureWnd(void)
{
	capDriverDisconnect (m_hCapWnd);
}
BOOL CCaptureWnd::bofVFW(void)
{
    BOOL m_bVFW=FALSE;
	char achDeviceVersion[80]; //设备版木信息
    char achDeviceAndVersion[160];//设备名及版木信息
    int nIndex;
    int  DriverCount=0;//支持的设备驱动程序个数
    for(nIndex=0; nIndex<10; nIndex++)
    {
      if (capGetDriverDescription (nIndex ,(LPSTR )achDeviceAndVersion,
		   sizeof(achDeviceAndVersion),(LPSTR )achDeviceVersion, sizeof(achDeviceVersion)))
        {
              strcat(achDeviceAndVersion,",");
              strcat(achDeviceAndVersion, achDeviceVersion) ;
              DriverCount++;
        }
          else
              break;
	}
	  if(DriverCount>0)m_bVFW=TRUE;
	
	return m_bVFW;
}


BOOL CCaptureWnd::CreateCaptureWindow(HWND hWnd/*parent window*/)
{
	if(hWnd==NULL||m_hCapWnd!=NULL)
		return FALSE;

	if(bofVFW()==FALSE)
	{
		AfxMessageBox("摄像头不支持VFW方式!\n请采用支持VFW方式的摄像头!");
		return FALSE;
	}
      int nIndex=0;
	  CAPDRIVERCAPS m_CapDrvCap; // CAPDRIVERCAPS结构,定义驱动器性能
	  RECT rc;
    
	  GetWindowRect(hWnd, &rc) ;
      m_hCapWnd=capCreateCaptureWindow(NULL ,
                                         WS_CHILD|WS_VISIBLE,0,0,
                                         (rc.right -rc.left),(rc.bottom-rc.top ),
                                          hWnd,//parent window
                                          1//child window id
                                          );
	   ASSERT (m_hCapWnd);
	   	////////////////////////////////////////
     for(nIndex=0;nIndex<10;nIndex++)
		{
            if (capDriverConnect (m_hCapWnd,nIndex))//连接第0号驱动器
	        {
                capDriverGetCaps (m_hCapWnd, &m_CapDrvCap,sizeof (CAPDRIVERCAPS));//得到驱动器的性能
                if (m_CapDrvCap.fCaptureInitialized ) //如果初始化成功
                    {
                         capPreviewRate (m_hCapWnd,15); //设置预示帧频
						 if(m_CapDrvCap.fHasOverlay)
						   capOverlay(m_hCapWnd, TRUE);//设置叠加方式
						 else
                           capPreview (m_hCapWnd, TRUE); //设置预示方式
                       return TRUE;
                    }
			}
         }
  
	  AfxMessageBox("视频捕捉卡初始化失败或与视频捕捉卡连接失败!");
             
      return FALSE;	
	
}

int  CCaptureWnd::CaptureSetup(int SETUP)
{
 if(m_hCapWnd==NULL)
	 return -1;
 CAPDRIVERCAPS CapDrvCaps;
//CAPDRIVERCAPS结构,定义了捕获驱动器的能力
 int result=-1;
 
 capDriverGetCaps(m_hCapWnd,&CapDrvCaps,sizeof(CAPDRIVERCAPS));//获取视频设备能力
 switch(SETUP)
 {
    case VideoDisplay:    //如果支持视频显示格式选择,则弹出视频显示格式选择对话框
                     if (CapDrvCaps.fHasDlgVideoDisplay )
					 {
						   capDlgVideoDisplay(m_hCapWnd);
						   result=SETUP;
					 }
				      break;
	case VideoFormat: //如果支持视频格式选择,则弹出视频格式选择对话框
                   if (CapDrvCaps.fHasDlgVideoFormat )
				   {
					   capDlgVideoFormat(m_hCapWnd);    
					   result=SETUP;
				   }
				   break;
	case VidoeSource:  //如果支持视频源选择,则弹出视频源选择对话框
                   if (CapDrvCaps.fHasDlgVideoSource )
				   {
					   capDlgVideoSource(m_hCapWnd);  
					   result=SETUP;
				   }
				   break;
	case VideoCompression: //弹出视频压缩选择对话框
		          {
		         	capDlgVideoCompression(m_hCapWnd);
			        result=SETUP;
		           }
		          break;
				 
	
	default:
	        	break;
   }
   
	return result;
		
}

void CCaptureWnd::SaveAVI(void)
{
 
      capFileGetCaptureFile (m_hCapWnd, szPath,sizeof(szPath));
	  CFileDialog dlgFile (FALSE /*bOpenFileDialog*/,
                "NULL" /*AVI1pszDefEzt*/,
                 szPath/*1pszFileName*/,
                OFN_HIDEREADONLY /* flags */,
              "(VFW) *.avi |*.avi||",
				  NULL /* hwndParent */);

	
     if (dlgFile.DoModal()==IDOK)
	 {   
		 memcpy(szPath,dlgFile.m_ofn.lpstrFile,80);
         capFileSetCaptureFile(m_hCapWnd, (LPSTR)szPath);
	     capCaptureSequence(m_hCapWnd);
	 }
	   return;

}

HGLOBAL CCaptureWnd::GrabFrame(BOOL bStop)
{ 
	HGLOBAL hGbl;
   if(bStop)
   {
	   capGrabFrame(m_hCapWnd);//截获当前图象
   }
   else
	   capGrabFrameNoStop(m_hCapWnd);
if(capEditCopy (m_hCapWnd)==FALSE)
 {
 AfxMessageBox("图象拷贝到剪贴板不成功!");
 }
 
  // capEditCopy (m_hCapWnd); //将图象拷贝到剪贴板

// 打开剪贴板
	if (OpenClipboard(NULL))
	{
		
		// 读取剪贴板中的图像
		hGbl = (HGLOBAL)::GetClipboardData(CF_DIB);
		// 关闭剪贴板
		CloseClipboard();
	}

	return hGbl;
}



void CCaptureWnd::Preview(BOOL bPreview)
{
   capPreview (m_hCapWnd, bPreview);//预览模式显示视频
}



⌨️ 快捷键说明

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