现在使用directshow调用摄像头拍照这个方法不行了吗?

zhou45214284 2015-05-23 10:29:15
我在网上下载了一个使用directshow调用摄像头拍照的程序,我运行里面的可执行文件可以实现拍照的功能。但是当我把程序源码编译通过之后,运行程序拍下的文件却没有图像,这到底怎么回事啊。急急急!!!!!!大神们帮帮我
...全文
2580 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
MAJIA1918 2017-08-10
  • 打赏
  • 举报
回复
这个不是driectshow的模式打开的,这是vfw
df_aef_thhtw 2016-07-15
  • 打赏
  • 举报
回复
你好,博主,能把你下载到的程序上传一下吗?
zhou45214284 2015-06-16
  • 打赏
  • 举报
回复
引用 4 楼 xjq2003 的回复:


#include <vfw.h>
HWND hWndC,ghWndCap;
void __fastcall TfmGoodsPhotoGet::sbCheckVideoClick(TObject *Sender)
{
  bool bVFWFlag;
  int iVFWCount;
 
  if(!bCheckVideoEnable)
  {//探杆打开
    hWndC = Panel8->Handle;
    //创建捕获窗,其中hWnd为主窗口句柄
    ghWndCap = capCreateCaptureWindow("Capture Window",WS_CHILD|WS_VISIBLE,
                                    0,0,352,298,hWndC,0);
 
    bVFWFlag = false;
    iVFWCount = 0;
    while((iVFWCount<1000)&&(bVFWFlag==false))
    {
      bVFWFlag = capDriverConnect(ghWndCap,0);
      iVFWCount++;
    }
    if(bVFWFlag==true)
    {
      CAPDRIVERCAPS caps;
      capDriverGetCaps(ghWndCap,sizeof(caps),&caps);
      if(caps.fHasOverlay) capOverlay(ghWndCap,TRUE);
 
      capPreviewScale(ghWndCap,1);
      capPreviewRate(ghWndCap,1000/24);   //   设置Preview模式的显示速率
      capPreview(ghWndCap,TRUE);   //启动Preview模式
      bCheckVideoEnable = true;
      sbCheckVideo->Caption = "关闭探杆";
      sbCapture->Enabled = true;
   }
  }
  else
  {//探杆关闭
    if(ghWndCap)
    {
      capPreview(ghWndCap,false);
      capCaptureStop(ghWndCap);
      capCaptureAbort(ghWndCap);
      capDriverDisconnect(ghWndCap);
      ::DestroyWindow(ghWndCap);
      ghWndCap=NULL;
      bCheckVideoEnable = false;
      sbCheckVideo->Caption = "打开探杆";
      sbCapture->Enabled = false;
    }
  }
}
//---------------------------------------------------------------------------
谢谢这位大哥,但是我最开始就是用的这种方法,这个不能再平板上用,连预览都不行。我调试发现在平板上预览时它是overlay模式而不是Preview模式,强制设成Preview也是无法预览 不知道是不是因为有前后两个摄像头的原因
zhou45214284 2015-06-16
  • 打赏
  • 举报
回复
引用 3 楼 zzbinfo 的回复:
这个部分我原来调试过,你如果打开文件不是图片文件,不能正确的显示图片的话,检查你写文件头的那部分代码,可能有问题,实在不行把代码发上来大家一起看看。
主要的保存照片代码就是这一段 BOOL SampleGrabberCB::SaveBitmap(BYTE * pBuffer, long lBufferSize ) { HANDLE hf = CreateFile( m_szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, NULL, NULL ); if( hf == INVALID_HANDLE_VALUE )return 0; // 写文件头 BITMAPFILEHEADER bfh; memset( &bfh, 0, sizeof( bfh ) ); bfh.bfType = 'MB'; bfh.bfSize = sizeof( bfh ) + lBufferSize + sizeof( BITMAPINFOHEADER ); bfh.bfOffBits = sizeof( BITMAPINFOHEADER ) + sizeof( BITMAPFILEHEADER ); DWORD dwWritten = 0; WriteFile( hf, &bfh, sizeof( bfh ), &dwWritten, NULL ); // 写位图格式 BITMAPINFOHEADER bih; memset( &bih, 0, sizeof( bih ) ); bih.biSize = sizeof( bih ); bih.biWidth = lWidth; bih.biHeight = lHeight; bih.biPlanes = 1; bih.biBitCount = 24; WriteFile( hf, &bih, sizeof( bih ), &dwWritten, NULL ); // 写位图数据 WriteFile( hf, pBuffer, lBufferSize, &dwWritten, NULL ); CloseHandle( hf ); return 0; }
xjq2003 2015-06-08
  • 打赏
  • 举报
回复
前面是预览 抓拍如下 [code=c #include <vfw.h> HWND hWndC,ghWndCap; void __fastcall TfmGoodsPhotoGet::sbCheckVideoClick(TObject *Sender) { bool bVFWFlag; int iVFWCount; if(!bCheckVideoEnable) {//探杆打开 hWndC = Panel8->Handle; //创建捕获窗,其中hWnd为主窗口句柄 ghWndCap = capCreateCaptureWindow("Capture Window",WS_CHILD|WS_VISIBLE, 0,0,352,298,hWndC,0); bVFWFlag = false; iVFWCount = 0; while((iVFWCount<1000)&&(bVFWFlag==false)) { bVFWFlag = capDriverConnect(ghWndCap,0); iVFWCount++; } if(bVFWFlag==true) { CAPDRIVERCAPS caps; capDriverGetCaps(ghWndCap,sizeof(caps),&caps); if(caps.fHasOverlay) capOverlay(ghWndCap,TRUE); capPreviewScale(ghWndCap,1); capPreviewRate(ghWndCap,1000/24); // 设置Preview模式的显示速率 capPreview(ghWndCap,TRUE); //启动Preview模式 bCheckVideoEnable = true; sbCheckVideo->Caption = "关闭探杆"; sbCapture->Enabled = true; } } else {//探杆关闭 if(ghWndCap) { capPreview(ghWndCap,false); capCaptureStop(ghWndCap); capCaptureAbort(ghWndCap); capDriverDisconnect(ghWndCap); ::DestroyWindow(ghWndCap); ghWndCap=NULL; bCheckVideoEnable = false; sbCheckVideo->Caption = "打开探杆"; sbCapture->Enabled = false; } } } //--------------------------------------------------------------------------- ][/code]
xjq2003 2015-06-08
  • 打赏
  • 举报
回复


#include <vfw.h>
HWND hWndC,ghWndCap;
void __fastcall TfmGoodsPhotoGet::sbCheckVideoClick(TObject *Sender)
{
  bool bVFWFlag;
  int iVFWCount;
 
  if(!bCheckVideoEnable)
  {//探杆打开
    hWndC = Panel8->Handle;
    //创建捕获窗,其中hWnd为主窗口句柄
    ghWndCap = capCreateCaptureWindow("Capture Window",WS_CHILD|WS_VISIBLE,
                                    0,0,352,298,hWndC,0);
 
    bVFWFlag = false;
    iVFWCount = 0;
    while((iVFWCount<1000)&&(bVFWFlag==false))
    {
      bVFWFlag = capDriverConnect(ghWndCap,0);
      iVFWCount++;
    }
    if(bVFWFlag==true)
    {
      CAPDRIVERCAPS caps;
      capDriverGetCaps(ghWndCap,sizeof(caps),&caps);
      if(caps.fHasOverlay) capOverlay(ghWndCap,TRUE);
 
      capPreviewScale(ghWndCap,1);
      capPreviewRate(ghWndCap,1000/24);   //   设置Preview模式的显示速率
      capPreview(ghWndCap,TRUE);   //启动Preview模式
      bCheckVideoEnable = true;
      sbCheckVideo->Caption = "关闭探杆";
      sbCapture->Enabled = true;
   }
  }
  else
  {//探杆关闭
    if(ghWndCap)
    {
      capPreview(ghWndCap,false);
      capCaptureStop(ghWndCap);
      capCaptureAbort(ghWndCap);
      capDriverDisconnect(ghWndCap);
      ::DestroyWindow(ghWndCap);
      ghWndCap=NULL;
      bCheckVideoEnable = false;
      sbCheckVideo->Caption = "打开探杆";
      sbCapture->Enabled = false;
    }
  }
}
//---------------------------------------------------------------------------
zzbinfo 2015-06-04
  • 打赏
  • 举报
回复
这个部分我原来调试过,你如果打开文件不是图片文件,不能正确的显示图片的话,检查你写文件头的那部分代码,可能有问题,实在不行把代码发上来大家一起看看。
zhou45214284 2015-05-28
  • 打赏
  • 举报
回复
咋就没人呢
zhou45214284 2015-05-23
  • 打赏
  • 举报
回复
程序调用摄像头可以实现预览就是不能拍照

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧