- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用 EmguCV 2.3.0 并以随机间隔从 Capture 中查询帧以保存到硬盘。问题是当我调用 Capture.QueryFrame() 或 Capture.QuerySmallFrame() 时,它被延迟了一帧。为了更清楚地说明这一点:我启动程序并查询一个指向我脸的框架。我的脸出现在 .jpeg 中。然后我将相机从我的脸上移开并查询另一帧,然后我的脸再次出现在 .jpeg 中。然后我再次将它指向我的脸,查询一个帧,.jpeg 包含远离我脸的图像。查询中似乎有 1 帧延迟。是否有一些底层缓冲区?是什么原因造成的?最重要的是:如何在不为单个捕获图像查询多个帧的情况下解决这个问题?
我的另一个问题是,当我将网络摄像头分辨率设置为 1600x1200 时,程序和计算机开始出现延迟 - 即使不使用图像或查询帧也是如此。这仅仅是因为我创建了一个 Capture 并将其保存在内存中吗?有没有办法减轻这种影响?
注意:此解决方案不足以快速获取帧,问题继续在这里: System.TypeInitializationException using Emgu.CV in C#
最佳答案
好吧,你遇到的问题是你没有处理你的旧捕获,所以当你发送另一个捕获时,它总是会返回旧的,然后再得到另一个。从网络摄像头示例调整而来的以下代码应该可以解决问题。
_capture = new Capture();
Image<Bgr, Byte> frame = _capture.QueryFrame();
Image<Gray, Byte> grayFrame = frame.Convert<Gray, Byte>();
Image<Gray, Byte> smallGrayFrame = grayFrame.PyrDown();
Image<Gray, Byte> smoothedGrayFrame = smallGrayFrame.PyrUp();
Image<Gray, Byte> cannyFrame = smoothedGrayFrame.Canny(new Gray(100), new Gray(60));
captureImageBox.Image = frame;
grayscaleImageBox.Image = grayFrame;
smoothedGrayscaleImageBox.Image = smoothedGrayFrame;
cannyImageBox.Image = cannyFrame;
_capture.Dispose();
就是_capture.Dispose();这是重要的一点。
至于您的 1600x1200 是的,您的权利是因为内存中有大量数据。首先从有效地“使用”内存流开始,并在使用完成后将其处理掉。这是通过“using”语句完成的,该语句会在开始时自动创建对象并在结束时调用其 .Dispose 函数,这样您就不必这样做了。请注意复制过程,否则会传递一个指针,当您退出使用代码时,您也将处理框架。使用图像时,您还应该练习“使用”语句。但是上面的代码现在看起来像这样:
Image<Bgr, Byte> frame;
using (Capture capture = new Capture())
{
frame = capture1.QueryFrame().Copy(); //You must copy else frame will be disposed off
}
Image<Gray, Byte> grayFrame = frame.Convert<Gray, Byte>();
Image<Gray, Byte> smallGrayFrame = grayFrame.PyrDown();
Image<Gray, Byte> smoothedGrayFrame = smallGrayFrame.PyrUp();
Image<Gray, Byte> cannyFrame = smoothedGrayFrame.Canny(new Gray(100), new Gray(60));
grayscaleImageBox.Image = grayFrame;
smoothedGrayscaleImageBox.Image = smoothedGrayFrame;
cannyImageBox.Image = cannyFrame;
其次,您可以使用 .Resize(scale, Interpolation Method) 调整捕获图像的大小。大图像通常使用专用图像采集卡从相机传递,因此显然避免了系统依赖性,高清 USB 网络摄像头不再是这种情况。
您可以像这样调整输入图像的大小,并使用您的“using”语句有效地使用您的最终代码如下所示:
Image<Bgr, Byte> frame;
using (Capture capture1 = new Capture())
{
frame = capture1.QueryFrame().Resize(0.5, Emgu.CV.CvEnum.INTER.CV_INTER_AREA).Copy();
captureImageBox.Image = frame;
}
using (Image<Gray, Byte> grayFrame = frame.Convert<Gray, Byte>())
{
grayscaleImageBox.Image = grayFrame;
using (Image<Gray, Byte> smallGrayFrame = grayFrame.PyrDown())
{
using (Image<Gray, Byte> smoothedGrayFrame = smallGrayFrame.PyrUp())
{
smoothedGrayscaleImageBox.Image = smoothedGrayFrame;
using (Image<Gray, Byte> cannyFrame = smoothedGrayFrame.Canny(new Gray(100), new Gray(60)))
{
cannyImageBox.Image = cannyFrame;
}
}
}
}
干杯克里斯
关于c# - C# QueryFrame 中的 EmguCV 2.3.0 返回上一个查询的帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7492764/
我有一个程序可以从硬盘加载图像。程序使用emgu cv编写,图像为Bgr图像。我想允许用户增加/减少图像的亮度/对比度。我怎样才能做到这一点?一些示例代码将不胜感激(因为我仍然是新手)。谢谢。 最佳答
摘要: 我正在尝试从 emgu 中的 IP 摄像头获取视频,我可以在浏览器中显示来自“http://169.254.255.253”等 IP 的视频。 问题: 我如何从 emgu 显示这个? 最佳答案
阅读 EmgCV 文档无法完全理解:哪些检测器可以与哪些 DescriptorExtractor 一起使用? Here据说: You can use it with the FREAK descrip
首先让我说,我确实完整地遵循了许多教程,例如位于 EmguCv 主站点上的教程,但抛出了 TypeInitializationException。 现在,仔细听,因为这是非常奇怪的部分。我首先要说我的
如何使用 emgucv 向图像添加高斯噪声(具有特定的均值和方差)? 最佳答案 我不太确定您要问什么,因为高斯滤波器往往用于消除噪声。要使用自定义内核,您可以使用以下代码。如果您希望添加具有设定均值和
谁能告诉我 emgucv 2.3 中是否存在用于找出图像的傅立叶变换的内置函数? 提前致谢 最佳答案 从我的回答 Fourier Transform + emgucv 你所追求的函数是 CvInvok
我在 C# 中使用 Emgu。 我有一个来自相机提要的 jepg 流。目前,我使用 2 个图像之间的 absdiff 来获取运动变化。 Image _diffBetweenCurrentAndPrev
我在 C# 中使用 Emgu。 我有一个来自相机提要的 jepg 流。目前,我使用 2 个图像之间的 absdiff 来获取运动变化。 Image _diffBetweenCurrentAndPrev
我正在尝试制作一个程序来检测魔方的颜色 这是到目前为止我已经启动并运行的屏幕截图,我基本上使用了 emguCV 附带的边缘检测示例中的代码,并用它来检测小立方体(但正如你所看到的,一些小立方体没有被检
我是图像处理的新手。在我的应用程序中,我想检测并去除眼睛周围的皮肤。 在上图中,我想提取没有皮肤的眼部区域(和眉毛)。 首先,我尝试在从图像中移除皮肤之前执行皮肤检测。我用了AdaptiveSkinD
有没有办法减少openCv中的灰度图像的灰度? 通常我有一个从0到256的灰度值 Image inputImage. 就我而言,我只需要0-10的灰度值。我有没有使用OpenCV做到这一点的好方法,尤
谁能告诉我使用OpenCV / EmguCV 3.0的Capture功能时使用了哪些USB摄像机?我已经尝试过Trust Webcam 1080p和Gearhead WC8500HD 1080p摄像机
在我的应用程序中,我以最高350 fps的帧速率在线处理图像(1920x400)。从这些图像中,我连续计算出位于图片中间的黑色物体的面积。该物体通常没有几个白洞。 Example for you to
EmguCV是否提供任何内置功能将彩色图像转换为RG色度(see Wikipedia link)? 提前致谢。 最佳答案 至少在v3.1上,我在EmguCV中找不到任何内置方法。因此,我最终还是采用了
我有一个应用程序,它将用于从扫描的文档中裁剪空格,例如 this image .我想要做的是只提取卡片并删除所有白色/空白区域。我正在使用 Emgucv FindContours 来执行此操作,目前我
使用cvsobel函数时遇到一些问题。我已经读过cvsobel将图像深度从8位增加到16位... 有人可以帮我弄清楚如何将其缩放回8位... 我的代码是 Image grayImage = TestI
我正在针对视频(文件)运行运动检测算法并遵循代码示例运动检测,并试图找到每个组件的角度和整体运动。我确实得到了一个运动值,带有 Blob 等,但每个组件的运动方向始终是 0 度或 360 度,没有任何
我正在使用 EmguCV 从我定义如下的捕获顺序查询帧: Capture cap; private void Form1_Load(object sender, EventArgs e) {
我目前正在使用SURF算法(在EmguCV 3.1上)测试两个图像是否可能对应于同一位置Image 1及其非常暗的版本,这给我带来了以下两个问题: 1-您认为计算两张图片之间的匹配次数是否是确定图像相
我使用带有边缘检测器应用程序的EmguCV houghines来检测消融棒(来自带有红色和白色条纹的木材的棒),我需要知道如何获得以像素为单位的线长,例如:第一行长50px。 代码样本 class H
我是一名优秀的程序员,十分优秀!