|
Hey there,
I want to make a MFC app that will capture 6 frames per second from the webcam connected to the PC. And i want to get the frames as imageData, i.e., as bitmap or PNG. The idea is to get these frames/images and then update them live on a web browser, so that it gives a "look and feel" of live video streaming.
I did a sample MFC app that shows webcam stream and then use the capGrabFrame & capFileSaveDIB to save the bmp to disk. This all works fine.
But now rather than saving into disk, i need to get the Image Data, so that i could make changes and update in a browser window.
Also, not sure whether it's possible to get 6 frames per second from the webcam.
Is this possible?
Please guide me with some code.
Thanks in advance.
|
|
|
|
|
It looks like you have gone down the Video For Windows route. You might want to consider stepping up to DirectShow instead. They are both old technologies, but VFW is just too old and annoying to deal with (we were using it on Windows 98).
Whether you will be able to achieve 6 FPS really depends on several factors, primarily if your camera supports that frame rate at your desired resolution.
You should be able to acquire the images as JPEGs or another bitmap format (RGB or YUV), but which formats are available depends completely on your camera.
Take a look at this totally awesome CP article: Realtime Webcam Sudoku Solver[^]
As I recall, it uses Video For Windows, so it should be easy for you to jump into the code and see how to access the image data.
For a DirectShow sample, check out this CP article: Video Preview and Frames Capture to Memory with SampleGrabber in Buffered Mode.[^]
And also browse through his other articles[^], it will not be a waste of your time.
Here are a couple more DirectShow related CP articles:
Simultaneous Previewing & Video Capture using DirectShow[^]
DirectX Video Stream and frame capture[^]
Soren Madsen
"When you don't know what you're doing it's best to do it quickly" - Jase #DuckDynasty
|
|
|
|
|
my printer is EPSON Stylus Photo R230 Series,IO is usb;
Anyone who has idea on how to retrieve status of printer hopefully can help me find the solution.
code:
HANDLE hPrinter = 0;
DWORD dwNeeded = 0;
PRINTER_INFO_2* pPrinterInfo = (PRINTER_INFO_2 *)malloc(0);
::OpenPrinter("EPSON Stylus Photo R230 Series", &hPrinter, NULL);
if (!::GetPrinter(hPrinter, 2, (LPBYTE)pPrinterInfo, 0, &dwNeeded)){
pPrinterInfo = (PRINTER_INFO_2 *)malloc(dwNeeded);
::GetPrinter(hPrinter, 2, (LPBYTE)pPrinterInfo, dwNeeded, &dwNeeded);
}
::ClosePrinter(hPrinter);
if (pPrinterInfo->Status == PRINTER_STATUS_PAPER_OUT){
free(pPrinterInfo);
return TRUE;
}
else{
free(pPrinterInfo);
return FALSE;
}
|
|
|
|
|
You can't get the actual status without sending a job to the printer. Only when the printer is accessed by the spooler API, the status is updated. You can't even check if the printer is connected and powered this way because OpenPrinter() and GetPrinter() will succeed and set the generic info fields like name and attributes as long as the printer is known.
|
|
|
|
|
Has idea on how to retrieve status of printer hopefully can help me find the solution?
I know application which can't get the IO status by running on ring3,so the status got is always zero.
|
|
|
|
|
Your code can retrieve the status. You may try to access the printer in some way so that the status is updated. But I have not done that and don't know how to do it.
|
|
|
|
|
Hi there. I am trying to use xxxx.lib file and all of it's xxxx.h files in my project. For the xxxx.h files I have set
Properties -> C/C++ -> General -> Additional Include Directories
and for the xxxx.lib files I have set
Properties -> Linker -> Input -> Additional Dependencies Other than these settings, I haven't done anything. So it says that it can not find certain methods and structures. What setting am I missing? Thanks for anything you share.
|
|
|
|
|
This can't be answered definitively without seeing the error messages. But it seems that you forgot to include the xxxx.h header file.
With VC, you can also add all necessary information to your source files without changing the project settings:
#include "[path_to_h]\xxxx.h"
#pragma comment(lib, "[path_to_lib]\\xxxx")
To avoid full paths, the library files can be copied to a subdirectory of your project directory (e.g. with subdirectory xxxx [path_to_lib] becomes .\\xxxx ).
|
|
|
|
|
Actually I am trying to use libavcodec library. As said earlier, I made their paths known to visual studio. I was trying to call function avcodec_find_encoder() but the error is shown. Here is what I am trying AND what I get
AVCodec* codec = avcodec_find_encoder((CodecID)5);
error LNK2019: unresolved external symbol "struct AVCodec * __cdecl avcodec_find_encoder(enum CodecID)" (avcodec_find_encoder@@YAPAUAVCodec@@W4CodecID@@@Z) referenced in function "public: void __thiscall ProjectName::FunctionName(char const *,int)
Apparently it means that it cann't find avcodec.h but both .h and .lib files are there.
|
|
|
|
|
That error is usually sourced by not linking against the module that contains the function (libavcodec in this case). Did you add libavcodec to your project settings (Linker - Input - Additional Dependicies)?
|
|
|
|
|
Jochen Arndt wrote: Did you add libavcodec to your project settings...
Oh yes. I added following line in the project setting ( also mentioned by you )
$(SolutionDir)\bin\lib\libavcodecD.lib;
|
|
|
|
|
To verify that the library is included, you can add the following line to one of your source files:
#pragma comment(lib, ".\\bin\\lib\\libavcodecD")
You may also enable the linker option /VERBOSE:LIB to show the libraries that are searched during the linking process. If the library is listed there, it is included.
If the error still occurs, the called function may be not located in that library (e.g. when there is a typing error). But avcodec_find_encoder() seems to be correct.
|
|
|
|
|
The error is till there.
However, I thank for the time you have spent answering me. One thing that may be of interest to you, I am using the library in a c++ project.
|
|
|
|
|
Where did you get the library from? Or did you build it yourself?
I ask this because a wrong library file is the last possible answer I can give you.
You can check the symbols that are exported by a library with the dumpbin utility:
dumpbin /exports filename
To use dumpbin from a command shell, open the command shell and execute vcvars32.bat which is located in the VC\bin directory of your Visual Studio installation.
|
|
|
|
|
Jochen,
since the VC 6.0 wizard does not give the /VERBOSE option, at least I counld not find it, could you give me some advice were in the .DSP file is the safe place to add it ?
I'll check the compiler doc to get more info on the option.
Thanks
Vaclav
Never mid - found it under Link -> Print progress messages
|
|
|
|
|
Vaclav_Sal wrote: I'll check the compiler doc to get more info on the option. It is a linker option, not a compiler option. So you might have looked at the wrong place.
When adding the command to the DSP file, the place should not care as long as the command is correct. But the VC 6 project settings should provide an input field for user defined linker options where you can enter the option (with more recent VC versions it is 'Additional Options' on the Linker - Command Line tab).
|
|
|
|
|
|
Along with "Additional Include Directories," there is also an "Additional Library Directories " option that you must set if the .lib file is not located in the project directory.
The difficult we do right away...
...the impossible takes slightly longer.
|
|
|
|
|
If you're using a C library from C++, you may need to wrap the include directive inside an extern "C" clause like ...
extern "C" {
#include "libxxxxx.h"
}
|
|
|
|
|
Django_Untaken wrote: I am trying to use xxxx.lib file and all of it's xxxx.h
[...]
What setting am I missing?
Have you checked the parental control setting?
Sorry, couldn't stop myself. Can't really offer any advice beyond that already given.
GOTOs are a bit like wire coat hangers: they tend to breed in the darkness, such that where there once were few, eventually there are many, and the program's architecture collapses beneath them. (Fran Poretto)
|
|
|
|
|
Dear folks,
Requirement is to Improve the application GUI So I have used VC2008 Feature Pack version 9.0.30411.0 and obtained the desired looks. But Now the problem is, If I run the application exe in target PC which feature pack is not installed. Then I'm unable to run the application due to feature pack is not get installed in target PC.
Normally we do, if I incorporate new component like "MSFlexGride", then the appropriate OCX file is added in the installation procedure. But In this case I couldn't find out related "DLL" or "OCX" files.
Kinldy help me to fix this problem.
|
|
|
|
|
|
|
try statically linking to the C-Runtime, ATL, and MFC...
-Change C++/Code Generation/Runtime Library from /MD to /MT.
-Change General/Use of ATL/ to "Static Link to ATL"
-Change General/Use of MFC/ to "Use MFC in a static Library"
|
|
|
|
|
I am trying to use TrackMouseEvent with a button on a dialog box created using the Resource Editor. I have tried the various sample codes examples available here on this site and on the internet.
I get some results, but not all. I keep coming up with references to subclassing the button in the literature, yet I do get WM_MOUSEMOVE & WM_MOUSELEAVE messages. When I try to subclass the button, I get an error which I interpret to mean that the button is already sub classed.
Isn't the button automatically subclassed when you use the template generated by the Resource Editor? If not and the button has to be subclassed, how do I do this.
Thanks,
Barry
|
|
|
|