下面是我写的打开并浏览摄像头图像的代码,写到OpenVideo按钮事件中:
//使用Tpanel控件来创建捕获窗口 
  ghCapWnd := CapCreateCaptureWindow('',//PChar('KruwoSoft'), //捕获窗口的名字
              WS_CHILD or WS_VISIBLE,//窗口样式 
              0, //X坐标
              0, //Y坐标
              gCapVideoArea.Width, //窗口宽
              gCapVideoArea.Height, //窗口高
              gCapVideoArea.Handle, //窗口句柄
              0); //一般为0
  //将一个捕获窗口与一个设备驱程相关联,第二个参数是个序号,当系统中装有多个显视驱动程序时,其值分别依次为0到总个数 
  CapDriverConnect(ghCapWnd, 0);
  //设置预览时的比例 
  CapPreviewScale(ghCapWnd, True);
  //设置预览时的帧频率 
  CapPreviewRate(ghCapWnd,60);
  //指定是否使用叠加模式,使用为1,否则为0
  //CapOverlay(ghCapWnd, True);        
  //如果要捕获视频流,则要使用函数指定不生成文件。否则将会自动生成AVI文件 
  CapCaptureSequenceNoFile(ghCapWnd);
  //打开预览
  CapPreview(ghCapWnd, True);现在遇到这样的问题:
当我点击OpenVideo按钮的时候,Panel开始显示黑色,但是什么也看不到。而当我在点击窗体其他地方,或移动窗体,或打开其他程序的时候,Panel才给我显示图像。我试了N次了,都是这样,搞不明白为什么?特来请教各位大虾。另外,如果我想保存一张图片,如何操作?
我使用过其它的类似的软件,我这个30万像素的摄像头只能保存320*240大小的图片,能不能保存的再大些?看了一些文章,好像只能这么大了,是吗?从来没接触过视频开发问题,请大家多帮忙,先谢谢了!

解决方案 »

  1.   

    http://www.progdigy.com/modules.php?name=DSPack下載一個DSPack、可簡化开发工作量。
    自帯DEMO、有捕捉摄像头TSampleGrabber等控件
      

  2.   

    是因为你调用CapCaptureSequenceNoFile(ghCapWnd);前没有设置好参数:)
    而且一般来说预览和捕获是不能同时执行的,如果你只想预览可以只调用CapPreview(ghCapWnd, True);如果你想边捕获边预览(就像一些视频聊天软件一样),你只能调用CapCaptureSequenceNoFile(ghCapWnd);然后在回调函数里面一方面显示在本地(自己写代码画出来)另一方面通过网络发送出去或者保存成文件。给你个完整的解决方案吧:)var
      ghCapWnd: HWND;const
      BMPInfo: TBitmapInfo = (
            bmiHeader:(
                    biSize : sizeof(BITMAPINFOHEADER);
                    biWidth : 176;
                    biHeight : 144;
                    biPlanes : 1;
                    biBitCount : 24;
                    biSizeImage : 76032));function fpProc(hWnd: HWND; lpVHdr: PVIDEOHDR): DWORD; stdcall;
    var
      buf: pointer;
    begin
      Form1.Image1.Canvas.Lock;
      try
        Form1.Image1.Picture.Bitmap.Handle := CreateDIBSection(0, BMPInfo, DIB_RGB_COLORS, buf, 0, 0);
        if buf <> nil then
          Move(lpVHdr.lpData^, buf^, BMPInfo.bmiHeader.biSizeImage);
      finally
        Form1.Image1.Canvas.Unlock;
      end;
      Result:=1;
    end;procedure TForm1.Button4Click(Sender: TObject);
    var
      capparms: TCAPTUREPARMS;
    begin
       ghCapWnd := CapCreateCaptureWindow(nil,//PChar('KruwoSoft'), //捕获窗口的名字
                  0,//窗口样式
                  0, //X坐标
                  0, //Y坐标
                  0, //窗口宽
                  0, //窗口高
                  Handle, //窗口句柄
                  0);
      capCaptureGetSetup(ghCapWnd, @CapParms, sizeof(TCAPTUREPARMS));  CapParms.vKeyAbort := 0;
      CapParms.fAbortLeftMouse := FALSE;
      CapParms.fAbortRightMouse := FALSE;
      CapParms.fYield := TRUE;
      CapParms.fCaptureAudio := FALSE;
      CapParms.wPercentDropForError := 100;
      CapParms.dwRequestMicroSecPerFrame:= 100000;
      capCaptureSetSetup(ghCapWnd, @CapParms, sizeof(TCAPTUREPARMS));
      CapDriverConnect(ghCapWnd, 1);
      capSetVideoFormat(ghCapWnd, @BMPInfo, sizeof(BMPInfo)); //设置视频格式,bmp图片的大小也由它决定
      capSetCallbackOnVideoStream(ghCapWnd, fpProc);
      CapCaptureSequenceNoFile(ghCapWnd);
    end;画到image里面去了,怎么保存成文件不用我说了吧:)
      

  3.   

    通过调整BMPInfo的值来选择视频格式,一般摄像头支持rgb24:160*120、176*144、320*240、352*288、640*480
      

  4.   

    谢谢clasj(我蛮怀) ,以后有问题还要麻烦你:)