obraz z kamery

0

witam wszystkich.
Mam taki problem. Otóż muszę napisać program, który będzie dodatkowo posiadał funkcję przechwytu obrazu z dwóch kamer przemysłowych. Popełniłem kiedyś coś podobnego na dspacku (z tym, że tylko dla kamerki internetowej - wszystko było OK). Korzystając ponownie z demosa PlayVideoCap napisałem coś podobnego. I zaczęły się schody. Obraz z kamer pobierany jest przez kartę video (4-channels PCI). W przykładzie PlayVideoCap nie ma nawet tego urządzenia na liście Devices. (Dodam, że na oryginalnym programie dołączonym do karty wszystko gra). Spróbowałem również w GrapEdit i tam taka sama sytuacja (to urządzenie nie istnieje). Wymieniłem kartę PCI na kartę video 4 channels - USB. Zarówno w delphi jak i w graphEdit widzę urządzenie. Wydawałoby się, że wszystko OK. Niestety nie wyświetla żadnego obrazu. Nie wiem co robię źle. Proszę pomocy!!!

0
HRESULT __fastcall TDXTarczka::CaptureVideo()
{
    HRESULT hr;
//    IBaseFilter *pSrcFilter=NULL;   JAK CO TO ODKOMENTOWAC

    // Get DirectShow interfaces
    hr = GetInterfaces();
    if (FAILED(hr))
    {
//        Msg(TEXT("Failed to get video interfaces!  hr=0x%x"), hr);
        return hr;
    }

    // Attach the filter graph to the capture graph
    hr = g_pCapture->SetFiltergraph(g_pGraph);
    if (FAILED(hr))
    {
//        Msg(TEXT("Failed to set capture filter graph!  hr=0x%x"), hr);
        return hr;
	}
		g_pGraphBuilder->QueryInterface(IID_IMediaControl, (void**)&g_pMediaControl);

    // Use the system device enumerator and class enumerator to find
    // a video capture/preview device, such as a desktop USB video camera.
    hr = FindCaptureDevice(&pSrcFilter);
    if (FAILED(hr))
    {
        // Don't display a message because FindCaptureDevice will handle it
        return hr;
    }
   
    // Add Capture filter to our graph.
	hr = g_pGraph->AddFilter(pSrcFilter, L"Video Capture");

//			hr = m_pFilterGraph->AddFilter(m_pGrabberF, L"Sample Grabber"); TO JEST GRABBIN FRAME'a


	if (FAILED(hr))
    {
//        Msg(TEXT("Couldn't add the capture filter to the graph!  hr=0x%x\r\n\r\n")
//            TEXT("If you have a working video capture device, please make sure\r\n")
//            TEXT("that it is connected and is not being used by another application.\r\n\r\n")
//            TEXT("The sample will now close."), hr);
        pSrcFilter->Release();
        return hr;
    }

    // Render the preview pin on the video capture filter
    // Use this instead of g_pGraph->RenderFile
	hr = g_pCapture->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
                                   pSrcFilter, NULL, NULL);
	if (FAILED(hr))
    {

        pSrcFilter->Release();
        return hr;
    }

    // Now that the filter has been added to the graph and we have
    // rendered its stream, we can release this reference to the filter.
    pSrcFilter->Release();
//		KURWAT->GetCurrentBuffer()
    // Set video window style and position
	hr = SetupVideoWindow();
//    if (FAILED(hr))
//    {
   //     Msg(TEXT("Couldn't initialize video window!  hr=0x%x"), hr);
//		return hr;
//	}

//#ifdef REGISTER_FILTERGRAPH
//    // Add our graph to the running object table, which will allow
//    // the GraphEdit application to "spy" on our graph
//    hr = AddGraphToRot(g_pGraph, &g_dwGraphRegister);
//
//#endif

    // Start previewing video data
    hr = g_pMC->Run();
    if (FAILED(hr))
	{
		return hr;
    }

    // Remember current state
    g_psCurrent = Running;

	return S_OK;
}


HRESULT __fastcall TDXTarczka::FindCaptureDevice(IBaseFilter ** ppSrcFilter)
{
    HRESULT hr;                           
    IBaseFilter * pSrc = NULL;
    CComPtr <IMoniker> pMoniker =NULL;
    ULONG cFetched;

    if (!ppSrcFilter)
        return E_POINTER;
   
    // Create the system device enumerator
    CComPtr <ICreateDevEnum> pDevEnum =NULL;

    hr = CoCreateInstance (CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
                           IID_ICreateDevEnum, (void **) &pDevEnum);
    if (FAILED(hr))
    {
//        Msg(TEXT("Couldn't create system enumerator!  hr=0x%x"), hr);
        return hr;
    }

    // Create an enumerator for the video capture devices
    CComPtr <IEnumMoniker> pClassEnum = NULL;

    hr = pDevEnum->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &pClassEnum, 0);
    if (FAILED(hr))
    {
//        Msg(TEXT("Couldn't create class enumerator!  hr=0x%x"), hr);
        return hr;
    }

    // If there are no enumerators for the requested type, then 
    // CreateClassEnumerator will succeed, but pClassEnum will be NULL.
    if (pClassEnum == NULL)
    {
//        MessageBox(ghApp,TEXT("No video capture device was detected.\r\n\r\n")
//                   TEXT("This sample requires a video capture device, such as a USB WebCam,\r\n")
//                   TEXT("to be installed and working properly.  The sample will now close."),
//                   TEXT("No Video Capture Hardware"), MB_OK | MB_ICONINFORMATION);
        return E_FAIL;
    }

	// Use the first video capture device on the device list.
	// Note that if the Next() call succeeds but there are no monikers,
	// it will return S_FALSE (which is not a failure).  Therefore, we
	// check that the return code is S_OK instead of using SUCCEEDED() macro.
	if (S_OK == (pClassEnum->Next (1, &pMoniker, &cFetched)))
	{
		// Bind Moniker to a filter object
        hr = pMoniker->BindToObject(0,0,IID_IBaseFilter, (void**)&pSrc);
        if (FAILED(hr))
        {
//            Msg(TEXT("Couldn't bind moniker to filter object!  hr=0x%x"), hr);
            return hr;
		}
    }
    else
    {
//        Msg(TEXT("Unable to access video capture device!"));
        return E_FAIL;
    }

    // Copy the found filter pointer to the output parameter.
    // Do NOT Release() the reference, since it will still be used
    // by the calling function.
    *ppSrcFilter = pSrc;

    return hr;
}


HRESULT __fastcall TDXTarczka::GetInterfaces(void)
{
    HRESULT hr;

    // Create the filter graph
    hr = CoCreateInstance (CLSID_FilterGraph, NULL, CLSCTX_INPROC,
                           IID_IGraphBuilder, (void **) &g_pGraph);
    if (FAILED(hr))
        return hr;

    // Create the capture graph builder
    hr = CoCreateInstance (CLSID_CaptureGraphBuilder2 , NULL, CLSCTX_INPROC,
                           IID_ICaptureGraphBuilder2, (void **) &g_pCapture);
    if (FAILED(hr))
        return hr;
    
    // Obtain interfaces for media control and Video Window
    hr = g_pGraph->QueryInterface(IID_IMediaControl,(LPVOID *) &g_pMC);
    if (FAILED(hr))
        return hr;

    hr = g_pGraph->QueryInterface(IID_IVideoWindow, (LPVOID *) &g_pVW);
    if (FAILED(hr))
        return hr;

    hr = g_pGraph->QueryInterface(IID_IMediaEvent, (LPVOID *) &g_pME);
    if (FAILED(hr))
        return hr;

    // Set the window handle used to process graph events
//    hr = g_pME->SetNotifyWindow((OAHWND)ghApp, WM_GRAPHNOTIFY, 0); odkomentowac
//
	return hr;
}


void __fastcall TDXTarczka::CloseInterfaces(void)
{
    // Stop previewing data
    if (g_pMC)
        g_pMC->StopWhenReady();

    g_psCurrent = Stopped;

    // Stop receiving events
//    if (g_pME)
//        g_pME->SetNotifyWindow(NULL, WM_GRAPHNOTIFY, 0); odkomentowac

    // Relinquish ownership (IMPORTANT!) of the video window.
    // Failing to call put_Owner can lead to assert failures within
    // the video renderer, as it still assumes that it has a valid
    // parent window.
    if(g_pVW)
	{
   //	g_pVW->
        g_pVW->put_Visible(OAFALSE);
        g_pVW->put_Owner(NULL);
    }

//#ifdef REGISTER_FILTERGRAPH
//	// Remove filter graph from the running object table
//	if (g_dwGraphRegister)
//		RemoveGraphFromRot(g_dwGraphRegister);
//#endif

    // Release DirectShow interfaces
	SAFERELEASE(g_pMC);
	SAFERELEASE(g_pME);
	SAFERELEASE(g_pVW);
	SAFERELEASE(g_pGraph);
    SAFERELEASE(g_pCapture);
}


HRESULT __fastcall TDXTarczka::SetupVideoWindow(void)
{
	HRESULT hr; // g_pVW->
    // Set the video window to be a child of the main window
	hr = g_pVW->put_Owner((OAHWND)((TWinControl*)AWEBCAMParent)->Handle);
	if (FAILED(hr))
		return hr;

	// Set video window style
	hr = g_pVW->put_WindowStyle(WS_CHILD | WS_CLIPCHILDREN);
	if (FAILED(hr))
		return hr;

	// Use helper function to position video window in client rect
	// of main application window
	ResizeVideoWindow();

	// Make the video window visible, now that it is properly positioned
	hr = g_pVW->put_Visible(OATRUE);
    if (FAILED(hr))
        return hr;

    return hr;
}


void __fastcall TDXTarczka::ResizeVideoWindow(void)
{
    // Resize the video preview window to match owner window size
    if (g_pVW)
    {
        RECT rc;
        
        // Make the preview video fill our window
		GetClientRect(((TWinControl*)AWEBCAMParent)->Handle, &rc);
      //  g_pVW->SetWindowPosition(0, 0, rc.right, rc.bottom);
    }
}


HRESULT __fastcall TDXTarczka::ChangePreviewState(int nShow)
{
    HRESULT hr=S_OK;
    
    // If the media control interface isn't ready, don't call it
    if (!g_pMC)
        return S_OK;
    
    if (nShow)
    {
        if (g_psCurrent != Running)
        {
            // Start previewing video data
			hr = g_pMC->Run();
			g_psCurrent = Running;
        }
    }
    else
    {
        // Stop previewing video data
        hr = g_pMC->StopWhenReady();
        g_psCurrent = Stopped;
    }

    return hr;
}

Jak nie ma sterownikow do kamery to nie wiem czy wykryje

0

Dzięki wielkie za podpowiedź.

Niestety wszystko jest w C. Nie wiem czy sobie poradzę. Bardziej bym potrzebował w Delphi. ale może coś się uda poprzerabiać. Dam znać.

1 użytkowników online, w tym zalogowanych: 0, gości: 1