首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

VFW视频捕获显示有关问题

2013-06-25 
VFW视频捕获显示问题描述:采用VFW捕获视频。在capSetCallbackOnVideoStream的回调函数中,将LPVIDEOHDR中的

VFW视频捕获显示问题
描述:
     采用VFW捕获视频。在capSetCallbackOnVideoStream的回调函数中,将LPVIDEOHDR中的数据传递给显示视频的窗口ShowVideoDlg(里面有显示视频的函数:ShowVideo2Window)。然后在ShowVideo2Window中用DrawDibDraw将传递的LPVIDEOHDR中的数据显示出来。
     其显示出来的效果如图:VFW视频捕获显示有关问题,左上角是直接预览的。而右下角的线条视频是在ShowVideo2Window中显示出来的。
     我的程序是参考了网上的一个代码,并且其运行他的代码效果也是一样的。我将这个程序编译然后在别的电脑上运行了下,效果也一样。

问题:
     (1)有谁遇到过这是什么问题呢?有好的解决办法没。(不准备采用directShow,就针对这个问题)
     (2)既然能预览视频,那么与摄像头与显示无关。而且参考的代码也有不少人说好,没有人出现我这样的问题,所以,猜测可能是与我硬件方面有关。但是在别的电脑上运行效果一样,我就不知道该如何判断了。但是,我猜测可能是捕获的视频数据有问题。会不会是我捕获的数据格式问题。不是rgb格式的数据。因此,问题是:我有没有办法分析出这些捕获的数据是RGB的还是什么格式的? VFW视频捕获显示问题 视频 rgb 摄像头
[解决办法]
单看这个图像看不出来,代码发我看看
[解决办法]
有点看不懂lz的意思,这里有一个简单的win32用VFW预览和录像的代码,lz可以参考下


#include <windows.h>
#include <vfw.h>
#include <commdlg.h>
#include "CapPicture.h"

LRESULT WINAPI MainWndProc( HWND, UINT, WPARAM, LPARAM ); 
LRESULT WINAPI SelCapDrvProc( HWND, UINT, WPARAM, LPARAM );
int EnumCapDrv();
VOID APIENTRY HandlePopupMenu(HWND, POINT);
DWORD WINAPI videoThreadProc(LPVOID lParam);


HANDLE ghInstance;
HWND hwndMain;
HWND hwndVideo;
HWND hwndSelCapDrvDlg;
HWND hwndSelCapDrvDlg_LBox;
HWND hwndExit;
HWND hwndMin;
HWND hwndHelp;
HWND hwndRecord;
HANDLE hVideoThread;
HRGN hRegion1;
CAPDRIVERCAPS CapDrvCaps;
bool isRecordFileOpen = false;
char recordFile[260];
bool isPicFileOpen = false;
char pictureFile[260];
bool isRecording = false;
bool threadEnd = false;

int PASCAL WinMain( HINSTANCE hInstance,
    HINSTANCE hPrevInstance,

    LPSTR lpszCmdLine,
    int nCmdShow )
{
   WNDCLASS wc;
   MSG msg;

   if( !hPrevInstance )
   {
      wc.lpszClassName = "GenericAppClass";
      wc.lpfnWndProc = MainWndProc;
      wc.style = CS_OWNDC 
[解决办法]
 CS_VREDRAW 
[解决办法]
 CS_HREDRAW;
      wc.hInstance = hInstance;
      wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
      wc.hCursor = LoadCursor( NULL, IDC_ARROW );
      wc.hbrBackground = CreateSolidBrush (RGB(196, 200, 204));


      wc.lpszMenuName = "GenericAppMenu";

      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;

      RegisterClass( &wc );
   }

   ghInstance = hInstance;

   hwndMain = CreateWindow( "GenericAppClass",
      "Super Video",
      WS_POPUP,
      100,
      100,
      500,
      500,
      NULL,
      NULL,
      hInstance,
      NULL
   );

   ShowWindow( hwndMain, nCmdShow );
   SetWindowRgn(hwndMain,hRegion1,1);

   while( GetMessage( &msg, NULL, 0, 0 ) ) {
      TranslateMessage( &msg );

      DispatchMessage( &msg );
   }

   return msg.wParam;
}

LRESULT CALLBACK MainWndProc( HWND hwndMain, UINT msg, WPARAM wParam,
   LPARAM lParam )
{
   HDC hDC = GetDC(hwndMain);
   RECT rc;           
   POINT pt;  

   switch( msg ) {
  case WM_LBUTTONDBLCLK:
      SetFocus(hwndMain);
      break;
      case WM_RBUTTONDOWN: 
            GetClientRect(hwndMain, (LPRECT) &rc); 
            pt.x = LOWORD(lParam); 
            pt.y = HIWORD(lParam); 
            if (PtInRect((LPRECT) &rc, pt)) 
                HandlePopupMenu(hwndMain, pt); 
            break; 
      case WM_PAINT:
         FrameRgn(hDC,hRegion1,CreateSolidBrush(RGB(0,0,0)),2,2); 
   BringWindowToTop(hwndSelCapDrvDlg);
         return( DefWindowProc( hwndMain, msg, wParam, lParam ));
  case WM_COMMAND:
   CAPSTATUS CapStatus;
   switch( wParam ) {
 
 case SOURCE:
      if(CapDrvCaps.fHasDlgVideoSource)
      capDlgVideoSource(hwndVideo);
      break;
   case FORMAT:
      if(CapDrvCaps.fHasDlgVideoFormat)
      {
      capDlgVideoFormat(hwndMain);
      capGetStatus(hwndVideo, &CapStatus, sizeof(CAPSTATUS));


      SetWindowPos(hwndVideo, NULL, 0, 0, CapStatus.uiImageWidth,
      CapStatus.uiImageHeight, SWP_NOZORDER 
[解决办法]
 SWP_NOMOVE);
      }
      break;
   case DISPLAY:
   if (CapDrvCaps.fHasDlgVideoDisplay)
   capDlgVideoDisplay(hwndVideo);
   break;
            case EXIT:
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_CLOSE, 0);
               break;
            case MINIMIZE:
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_MINIMIZE, 0);
               break;
            case HELP:
               SendMessage(hwndMain, WM_SYSCOMMAND, SC_CONTEXTHELP, 0);
               break;
            case RECORDVIDEO:
            if(HIWORD(wParam) == BN_CLICKED && (HWND) lParam == hwndRecord)
            {
   if (!isRecordFileOpen)
   {
   OPENFILENAME ofn;
   ZeroMemory(&ofn, sizeof(OPENFILENAME));
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwndMain;
ofn.lpstrFile = recordFile;
ofn.nMaxFile = sizeof(recordFile);
ofn.lpstrFilter = "Video\0*.avi";
ofn.nFilterIndex = 1;
ofn.lpstrFileTitle = NULL;
ofn.nMaxFileTitle = 0;
ofn.lpstrInitialDir = NULL;
ofn.Flags = OFN_PATHMUSTEXIST 
[解决办法]
 OFN_FILEMUSTEXIST;
if(GetSaveFileName(&ofn) == TRUE)
{
strcpy(recordFile, ofn.lpstrFile);
strcat(recordFile, ".avi");
isRecordFileOpen = true; 
DWORD id;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
hVideoThread = CreateThread(&sa, (ULONG)0, 
videoThreadProc, (LPVOID)(ULONG)0, (ULONG)0, &id);
if(hVideoThread == NULL)
MessageBox(NULL, "Creation of Record Thread failed!", "Thread", MB_OK 
[解决办法]
 MB_ICONEXCLAMATION);

break;
}
}

if (isRecordFileOpen) 
{
if(isRecording)
{
threadEnd = true;
capFileSaveAs(hwndVideo, recordFile);


SetWindowText(hwndRecord, "Record Video");
isRecording = false;
break;
}

if(!isRecording )
{
int a = 0;

MessageBox(hwndMain, "Do you want to write over the open file?",
"File warning", MB_YESNO 
[解决办法]
 MB_ICONWARNING);
if (a != IDYES)
{
isRecordFileOpen = false;
SendMessage(hwndMain, WM_COMMAND, MAKEWPARAM(RECORDVIDEO, BN_CLICKED), (LPARAM) hwndRecord);
}

if (a == IDYES)
{
capCaptureSequence(hwndVideo);
isRecording = true;
}

break;
}
}
}
         break;
         }
      break;
     case WM_CREATE:
      
      RECT helpRect, minRect, exitRect;
      HRGN helpRgn, minRgn, exitRgn;
        hRegion1 = CreateRoundRectRgn(100,100,500, 500,20,20);   
  hwndVideo = capCreateCaptureWindow(
  (LPSTR) "My Capture Window",
  WS_CHILD 
[解决办法]
 WS_VISIBLE,
  150, 150, 300, 280,
  (HWND) hwndMain,
  (int) 1);
hwndExit = CreateWindow (
"button",
"x",
WS_CHILD 
[解决办法]
 WS_VISIBLE 
[解决办法]
 BS_PUSHBUTTON 
[解决办法]
 BS_CENTER 
[解决办法]
 BS_VCENTER,
470, 110, BUTTONSIZE, BUTTONSIZE,
hwndMain,
(HMENU) EXIT,
(HINSTANCE)ghInstance,
(LPVOID)NULL);
hwndMin = CreateWindow (
"button",
"-",
WS_CHILD 
[解决办法]
 WS_VISIBLE 
[解决办法]
 BS_PUSHBUTTON 
[解决办法]
 BS_CENTER 
[解决办法]
 BS_VCENTER,
450, 110, BUTTONSIZE, BUTTONSIZE,
hwndMain,
(HMENU) MINIMIZE,
(HINSTANCE)ghInstance,
(LPVOID)NULL);  
hwndHelp = CreateWindow (
"button",
"?",
WS_CHILD 
[解决办法]
 WS_VISIBLE 
[解决办法]
 BS_PUSHBUTTON 
------解决方案--------------------


 BS_CENTER 
[解决办法]
 BS_VCENTER,
430, 110, BUTTONSIZE, BUTTONSIZE, 
hwndMain, 
(HMENU) HELP,
(HINSTANCE)ghInstance,
(LPVOID)NULL);
hwndRecord = CreateWindow (
"button", 
"录像", 
WS_CHILD 
[解决办法]
 WS_VISIBLE 
[解决办法]
 BS_PUSHBUTTON 
[解决办法]
 BS_CENTER 
[解决办法]
 BS_VCENTER, 
250, 464, 90, 28,
hwndMain, 
(HMENU) RECORDVIDEO,
(HINSTANCE)ghInstance,
(LPVOID)NULL);

  GetClientRect(hwndHelp, &helpRect);
  GetClientRect(hwndMin, &minRect);
  GetClientRect(hwndExit, &exitRect);
      
  helpRgn = CreateEllipticRgnIndirect(&helpRect);
minRgn = CreateEllipticRgnIndirect(&minRect);
exitRgn = CreateEllipticRgnIndirect(&exitRect);
    
    SetWindowRgn(hwndExit,exitRgn,1);
    SetWindowRgn(hwndMin,minRgn,1);    
    SetWindowRgn(hwndHelp,helpRgn,1);

hwndSelCapDrvDlg = CreateDialog((HINSTANCE)ghInstance, 
MAKEINTRESOURCE( SELCAPDRVDLG  ), 
0, (DLGPROC)SelCapDrvProc);
hwndSelCapDrvDlg_LBox = GetDlgItem(hwndSelCapDrvDlg, 
      SELCAPDRVDLG_LSTBOX);
    EnumCapDrv();
      break;
      case WM_DESTROY:
       capPreview(hwndVideo, FALSE);
       capDriverDisconnect(hwndVideo);
         PostQuitMessage( 0 );
         break;
      default:
         return( DefWindowProc( hwndMain, msg, wParam, lParam ));

   }

   return 0;
}

LRESULT CALLBACK SelCapDrvProc( HWND hWnd, UINT msg, 
WPARAM wParam, LPARAM lParam )
{

switch(msg)
{
case WM_INITDIALOG:
    return TRUE;
case WM_COMMAND:
switch ( wParam )
{
case SELCAPDRVDLG_BUTTON:
int sel = 0;
SendMessage( hwndSelCapDrvDlg_LBox, LB_GETSELITEMS, 1, sel);
SendMessage( hwndVideo, WM_CAP_DRIVER_CONNECT, sel, 0L); 
SendMessage( hwndSelCapDrvDlg, WM_CLOSE, 0, 0);
SendMessage( hwndVideo, WM_CAP_DRIVER_GET_CAPS,
 sizeof(CAPDRIVERCAPS), (LONG) (LPVOID) &CapDrvCaps);
capPreviewRate( hwndVideo, 66 );
capPreview( hwndVideo, TRUE );
}
return TRUE;
case WM_CLOSE:
DestroyWindow(hwndSelCapDrvDlg);
return TRUE;


}

return( 0L );
}

int EnumCapDrv()
{
char szDeviceName[80];
char szDeviceVersion[80];
char item[161];
int i;

for (i=0; i<10; i++)
{
if ( capGetDriverDescription(i, szDeviceName, sizeof(szDeviceName),
szDeviceVersion, sizeof(szDeviceVersion)) )
{
strcpy(item, szDeviceName);
strcat(item, " ");
strcat(item, szDeviceVersion);
SendMessage(hwndSelCapDrvDlg_LBox, LB_ADDSTRING, 0, 
               (LPARAM) item);
            SendMessage(hwndSelCapDrvDlg_LBox, LB_SETITEMDATA, i, (LPARAM) i);
        }
    }
    
    return 0;
}

VOID APIENTRY HandlePopupMenu(HWND hwnd, POINT pt) 

    HMENU hmenu;    
    HMENU hmenuTrackPopup;
hmenu = LoadMenu((HINSTANCE)ghInstance, "PopupMenu"); 
    if (hmenu == NULL) 
        return; 
    hmenuTrackPopup = GetSubMenu(hmenu, 0); 
    ClientToScreen(hwnd, (LPPOINT) &pt); 
    TrackPopupMenu(hmenuTrackPopup, TPM_LEFTALIGN 
[解决办法]
 TPM_LEFTBUTTON, 
        pt.x, pt.y, 0, hwnd, NULL); 
    DestroyMenu(hmenu); 
}

DWORD WINAPI videoThreadProc(LPVOID lParam)
{
SetWindowText(hwndRecord, "停止");
capCaptureSequence(hwndVideo);
isRecording = true;
while (!threadEnd)
;
MessageBox(NULL, "Leaving Thread", "thread", NULL);
return 0;
}

热点排行