- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
由于在使用 c++ 和 opencv 时难以更改相机的分辨率,我不得不将我的眼动追踪软件更改为 directshow。
Directshow 对我来说是新手,很难理解所有内容。但我发现这个很好的例子非常适合捕捉和查看网络摄像头。
http://www.codeproject.com/Articles/12869/Real-time-video-image-processing-frame-grabber-usi
我使用的是不需要 directShow SDK 的版本。 (不过例子中用的还是directshow对吧??)
#include <windows.h>
#include <dshow.h>
#pragma comment(lib,"Strmiids.lib")
#define DsHook(a,b,c) if (!c##_) { INT_PTR* p=b+*(INT_PTR**)a; VirtualProtect(&c##_,4,PAGE_EXECUTE_READWRITE,&no);\
*(INT_PTR*)&c##_=*p; VirtualProtect(p, 4,PAGE_EXECUTE_READWRITE,&no); *p=(INT_PTR)c; }
// Here you get image video data in buf / len. Process it before calling Receive_ because renderer dealocates it.
HRESULT ( __stdcall * Receive_ ) ( void* inst, IMediaSample *smp ) ;
HRESULT __stdcall Receive ( void* inst, IMediaSample *smp ) {
BYTE* buf; smp->GetPointer(&buf); DWORD len = smp->GetActualDataLength();
HRESULT ret = Receive_ ( inst, smp );
return ret;
}
int WINAPI WinMain(HINSTANCE inst,HINSTANCE prev,LPSTR cmd,int show){
HRESULT hr = CoInitialize(0); MSG msg={0}; DWORD no;
IGraphBuilder* graph= 0; hr = CoCreateInstance( CLSID_FilterGraph, 0, CLSCTX_INPROC,IID_IGraphBuilder, (void **)&graph );
IMediaControl* ctrl = 0; hr = graph->QueryInterface( IID_IMediaControl, (void **)&ctrl );
ICreateDevEnum* devs = 0; hr = CoCreateInstance (CLSID_SystemDeviceEnum, 0, CLSCTX_INPROC, IID_ICreateDevEnum, (void **) &devs);
IEnumMoniker* cams = 0; hr = devs?devs->CreateClassEnumerator (CLSID_VideoInputDeviceCategory, &cams, 0):0;
IMoniker* mon = 0; hr = cams->Next (1,&mon,0); // get first found capture device (webcam?)
IBaseFilter* cam = 0; hr = mon->BindToObject(0,0,IID_IBaseFilter, (void**)&cam);
hr = graph->AddFilter(cam, L"Capture Source"); // add web cam to graph as source
IEnumPins* pins = 0; hr = cam?cam->EnumPins(&pins):0; // we need output pin to autogenerate rest of the graph
IPin* pin = 0; hr = pins?pins->Next(1,&pin, 0):0; // via graph->Render
hr = graph->Render(pin); // graph builder now builds whole filter chain including MJPG decompression on some webcams
IEnumFilters* fil = 0; hr = graph->EnumFilters(&fil); // from all newly added filters
IBaseFilter* rnd = 0; hr = fil->Next(1,&rnd,0); // we find last one (renderer)
hr = rnd->EnumPins(&pins); // because data we are intersted in are pumped to renderers input pin
hr = pins->Next(1,&pin, 0); // via Receive member of IMemInputPin interface
IMemInputPin* mem = 0; hr = pin->QueryInterface(IID_IMemInputPin,(void**)&mem);
DsHook(mem,6,Receive); // so we redirect it to our own proc to grab image data
hr = ctrl->Run();
while ( GetMessage( &msg, 0, 0, 0 ) ) {
TranslateMessage( &msg );
DispatchMessage( &msg );
}
};
为来自凸轮的每个新帧调用 HRESULT Receive 方法。评论说 buf 包含数据。但是我有 3 个问题。
我无法包含 opencv 库。我在 visual studio 中创建了一个新项目,并添加了我一直包含的相同属性表。与早期项目的唯一区别是我现在创建了一个完全空的项目,之前我创建了一个 win32 应用程序。如何将opencv添加到directshow工程中?
上面的例子。来自缓冲区。这是一个指向数据的指针。我如何将其放入 iplImage/Mat 以用于 opencv calc?
有没有办法不显示来自网络摄像头的图像(我只需要对帧执行一些算法,我想删除包含结果的窗口可能会给我更多分析算法的能力?!)
谢谢!
最佳答案
使用 DirectShow,您通常会创建一个管道,即一个图形,然后向其中添加过滤器,如下所示:
Camera -> [可能是一些额外的东西] -> Sample Grabber -> Null Renderer
相机,Sample Grabber , Null Renderer都是干净的 Windows 附带的所有标准组件。 Sample Grabber 可以设置为通过 ISampleGrabberCB::SampleCB
给您回电并为您提供捕获的每个视频帧的数据。 Null Renderer 是管道的终止而不在监视器上显示视频(只是视频捕获)。
SampleCB
关键字为您带来您需要的示例代码。通过此调用收到数据后,您可以按照@praks411 的建议将其转换/包装到 IPL/OpenCV 类中。
如此简单地完成它,您就不需要 DirectShow BaseClasses,并且代码将仅仅是常规的 ATL/MFC 代码和项目。确保使用 CComPtr
包装器类来处理 COM 接口(interface),以免丢失引用和泄漏对象。最新的 Windows SDK 中可能缺少某些声明,因此您需要使用 Windows SDK 6.x 或只从那里复制缺少的部分。
另见:
关于visual-c++ - 从 directshow 获取 iplImage 或 Mat 到 opencv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16477314/
是否可以使用 OpenCv (JavaCv) 将图像放入图像中。例如,我有一张 1000x1000 的图像和一张 100x100 的图像。在 600x600 的位置,我想将较小的图像放在较大的图像中。
我必须在内存中保存预定义数量的图像。我创建了一个像这样的数组: int nb_frame_decalage=10; IplImage** accumulateur_image; CvCapture*
我想使用下面的代码保存一个 IplImage(不是 IplImage*) IplImage ipl_from_mat((IplImage)imgDisparity8U); cvNamedWindow(
我需要将 8 位 IplImage 转换为 32 位 IplImage。使用来自整个网络的文档,我尝试了以下操作: // general code img2 = cvCreateImage(cvSiz
当我尝试使用 cvCopy 将一个由 3 个 channel 组成的 IplImage 复制到一个具有 4 个 channel 的 IplImage(我稍后需要额外的 channel )时,我得到的只
我有一个 8 位的 IplImage,我想将它转换为 24 位的 IplImage。我该怎么做? 最佳答案 假设您的灰度图像位于名为 image 的变量中 - IplImage *rgbimage =
我想知道在 opencv 中裁剪 IplImage 的最有效方法是什么。我目前正在执行以下操作,但它似乎太复杂了,我确信有更好的方法。 // set ROI on original image
该代码用于8位数据,以生成灰度IplImage。 IplImage* img_gray_resize = NULL; img_gray_resize = cvCreateImage(c
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我有一个变量 char* ImgMem,它包含所需图像的图像内存(三个 channel /RAW 16),我想将它分成三个并将每个在单 channel 的 IplImage 中:一个用于 R,一个用于
是否有一种简单且成本低廉的方法可以沿 y 轴翻转 IplImage?我正在使用高帧率。 最佳答案 cvFlip(参见 Operation On Arrays )可以原地翻转。支持水平、垂直和组合翻转。
如何使用 OpenCV 获得最清晰的 iplimage?当没有训练图像进行比较时。 例如,有一个移动手的网络摄像头输入。但是当我播放这个视频时,我得到了 10 个 iplimages。但只有第五个更清
我像这样在 IplImage 上绘制对象: cvLine(image, point_1, point_2, color, thickness, CV_AA); // Line cvCircle(mag
我正在尝试从通过 USB 连接到 Raspberry Pi 的罗技高清摄像头捕获帧,RP 正在运行 arch linux,我正在使用 OpenCV C api 和 TCP 客户端。 TCP服务器在ub
当我们有一个 IplImage ,我们如何保存它以便以后使用,或者在我们的代码之外将其作为图像查看(例如通过 png 或 jpeg)? 作为代码示例,我有以下内容: void SaveImage()
OpenCV 中的IplImage 是什么?你能解释一下它作为一种类型的含义吗?我们应该什么时候使用它? 谢谢。 最佳答案 根据您在问题中的“c++”标签:你不应该使用它,你应该使用 cv::Mat。
不知道为什么会这样。方法 : IplImage.createFrom(image); 正在挂起而没有返回任何值。我尝试了多个图像,并确认了它们的存在。我正在编写一个利用模板匹配的应用程序,但是这个第一
我正在尝试对图像应用概率霍夫变换,但出现此编译器错误: invalid initialization of reference of type ‘cv::InputArray {aka const c
我正在Visual Studio 2012上使用OpenCV2.4.5和OpenNI2.0(带有SDK Kinect 1.6)。我尝试开发凝视跟踪应用程序,因为我使用“Kinect传感器”获取imag
我尝试将黑白 UIImage 转换为 IplImage,但从控制台提供这些。可以做什么? CGBitmapContextCreate: unsupported parameter combinatio
我是一名优秀的程序员,十分优秀!