使用 aforge 或任何其他 .net 解决方案、emgucv、tbeta 伪造热像仪

发布于 2024-09-15 15:44:23 字数 785 浏览 6 评论 0原文

我正在模拟热感相机效果。我在聚会上有一个网络摄像头对准墙前的人们。我采用了背景减法技术,并使用 Aforge blobcounter 得到了我想要用渐变着色填充的斑点。我的问题 = GetBlobsEdgePoints 不返回排序的点云,因此我无法将其与 GDI+ 中的 PathGradientBrush 等一起使用来简单地绘制渐变。

  1. 我正在寻找简单、快速的算法来跟踪路径中的斑点(可能会出错)。
  2. 一种跟踪 blobcounter 接收到的 blob 的方法。
  3. 关于模拟效果的其他方法的建议。

我快速浏览了 Emgu.CV.VideoSurveillance 但没有让它工作(示例是 v1.5,我使用了 v2+),但我放弃了,因为人们说它在论坛上很慢。

感谢您的阅读。

aforge背景去除示例代码

            Bitmap bmp =(Bitmap)e.VideoFrame.Clone();
        if (backGroundFrame == null)
        {
            backGroundFrame = (Bitmap)e.VideoFrame.Clone();
            difference.OverlayImage = backGroundFrame;
        }

        difference.ApplyInPlace(bmp);
        bmp = grayscale.Apply(bmp);
        threshold.ApplyInPlace(bmp);

I am simulating a thermal camera effect. I have a webcam at a party pointed at people in front of a wall. I went with background subtraction technique and using Aforge blobcounter I get blobs that I want to fill with gradient coloring. My problem = GetBlobsEdgePoints doesn't return sorted point cloud so I can't use it with, for example, PathGradientBrush from GDI+ to simply draw gradients.

  1. I'm looking for simple,fast, algorithm to trace blobs into path (can make mistakes).
  2. A way to track blobs received by blobcounter.
  3. A suggestion for some other way to simulate the effect.

I took a quick look at Emgu.CV.VideoSurveillance but didn't get it to work (examples are for v1.5 and I went with v2+) but I gave up because people say it's slow on forums.

thanks for reading.

sample code of aforge background removal

            Bitmap bmp =(Bitmap)e.VideoFrame.Clone();
        if (backGroundFrame == null)
        {
            backGroundFrame = (Bitmap)e.VideoFrame.Clone();
            difference.OverlayImage = backGroundFrame;
        }

        difference.ApplyInPlace(bmp);
        bmp = grayscale.Apply(bmp);
        threshold.ApplyInPlace(bmp);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

能否归途做我良人 2024-09-22 15:44:23

好吧,您可以发布一些 GetBlobsEdgePoints 结果的示例图像,这样如果需要图像处理算法,可能会更容易理解哪些类型。

1)你可以尝试贪心算法,首先随机选择一个点,将该点标记为“taken”,选择最近的未标记为“taken”的点,依此类推。
您需要找到合适的终止条件。如果可能有多个分离路径,您需要找出距离点需要多远才能成为分离路径一部分的定义。

3) 如果您有静态背景,您可以尝试在两个时移图像之间创建差异,例如相隔 200 毫秒。只需逐个像素进行差异,并使用 abs(diff) 作为热色图中的索引即可。这将提供更像移动物体的边缘发光效果。

Well, could you post some sample image of the result of GetBlobsEdgePoints, then it might be easier to understand what types if image processing algorithms are needed.

1) You may try a greedy algorithm, first pick a point at random, mark that point as "taken", pick the closest point not marked as "taken" and so on.
You need to find suitable termination conditions. If there can be several disjunct paths you need to find out a definition of how far away points need to be to be part of disjunct paths.

3) If you have a static background you can try to create a difference between two time shifted images, like 200ms apart. Just do a pixel by pixel difference and use abs(diff) as index in your heat color map. That will give more like an edge glow effect of moving objects.

归属感 2024-09-22 15:44:23

这是我要采取的方向(目前看起来最好):

  1. 通过我自己的逻辑定义斑点上的一组点(皮肤斑点的颜色应该更暖等......)
  2. 在这些点周围绘制渐变< /p>

     GraphicsPath gp=new GraphicsPath();
                var rect = new Rectangle(CircumferencePoint.X - 半径, CircumferencePoint.Y - 半径, 半径*2, 半径*2);
                gp.AddEllipse(矩形);
                GradientShaper = new PathGradientBrush(gp);
                GradientShaper.CenterColor = Color.White;
                GradientShaper.SurroundColors = aroundingColors;
                DrawBmp.FillPath(GradientShaper,gp);
    
  3. 用斑点形状掩盖这些渐变

     blobCounter.ExtractBlobsImage(bmp,blob,true);
                mask.OverlayImage = blob.Image;
                mask.ApplyInPlace(rslt);
    
  4. 使用颜色重新映射着色

tnx以获取帮助@Albin

This is the direction i'm going to take (looks best for now):

  1. Define a set of points on the blob by my own logic (color of skin blobs should be warmer etc..)
  2. draw gradients around those points

                GraphicsPath gp=new GraphicsPath();
                var rect = new Rectangle(CircumferencePoint.X - radius, CircumferencePoint.Y - radius, radius*2, radius*2);
                gp.AddEllipse(rect);
                GradientShaper = new PathGradientBrush(gp);
                GradientShaper.CenterColor = Color.White;
                GradientShaper.SurroundColors = surroundingColors;
                drawBmp.FillPath(GradientShaper,gp);
    
  3. mask those gradients with blob shape

                blobCounter.ExtractBlobsImage(bmp,blob,true);
                mask.OverlayImage = blob.Image;
                mask.ApplyInPlace(rslt);
    
  4. colorize with color remapping

tnx for the help @Albin

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文