【问题标题】:Processing : how to set an image to the foreground处理:如何将图像设置为前景
【发布时间】:2017-01-21 04:23:53
【问题描述】:

我想知道是否有人可以帮助我使用处理将图像设置为前景。 我有一个草图,其中视频以连续循环的形式显示,在该视频上方,有一个 alpha 蒙版可以查看透明的视频。 然后,使用 IR 接近传感器触发来自网络摄像头的视频。此视频被圆柱体扭曲,我希望视频位于蒙版下方,因为我会将其放大以适合蒙版。

我在互联网上搜索,但一无所获。 我试图在视频下方移动上面的线条,但没有任何效果。当没有翘曲时,我使用以前的版本进行了此操作,我只需移动两条线,它就可以工作了。但是现在我有这种扭曲,没有任何效果,它让我发疯......

非常感谢您的帮助。 这是我的代码:

/////////////////////////////////////// //////// 编辑 ///////////////////////////////////////// /////

再次感谢您的帮助,对链接感到抱歉,我不知道。 我知道如何使用网络摄像头/图片中的电影/视频作为纹理,这不是我的问题。 我遇到的问题是我会在带有纹理的形状上方放置一个蒙版,我不知道该怎么做,我尝试搜索了很多东西。自3天以来我一直在处理这个问题...... 因此,在这里我隔离了问题(MCVE)的代码,关于蒙版,我使用 Photoshop 创建了它:一个带有黑色背景和中间透明形状的简单形状,以具有透明度的 PNG 格式导出到网络。

int tubeRes = 32;
float[] tubeX = new float[tubeRes];
float[] tubeY = new float[tubeRes];
PImage img;
PImage masque;

void setup() {
  size(1280, 1024, P3D);
  img = loadImage("berlin-1.jpg");
  masque = loadImage("mask.png");
  float angle = 210.0 / tubeRes;
  for (int i = 0; i < tubeRes; i++) {
    tubeX[i] = cos(radians(i * angle));
    tubeY[i] = sin(radians(i * angle));
  }
  noStroke();
}

void draw() {
  translate(width / 2, height / 2);
  beginShape(QUAD_STRIP);
  texture(img);
  for (int i = 0; i < tubeRes; i++) {
    float x = tubeX[i] * 120;
    float z = tubeY[i] * 100;
    float u = img.width / tubeRes * i;
    vertex(x, -270, z, u, 0);
    vertex(x, 230, z, u, img.height);
  }
  endShape();
  beginShape(QUADS);
  texture(img);
  vertex(0, -100, 0, 0, 0);
  vertex(100, -100, 0, 100, 0);
  vertex(100, 100, 0, 100, 100);
  vertex(0, 100, 0, 0, 100);
  endShape();
  translate(-640, -515);
}

enter image description here

【问题讨论】:

  • 我不确定你在问什么。如果您发布minimal reproducible example,您的运气会更好。创建一个只显示问题而没有任何额外代码的小示例程序。尽可能硬编码。我们可能不需要串行的东西,甚至可能不需要 opencv 的东西。使用硬编码值(和电影文件而不是相机源)来显示问题,我们会更容易为您提供帮助。
  • 嗨,凯文,感谢您的回复。抱歉,这里是 MCVE。在圆柱体上的翘曲图像下方是蒙版。我希望这个面具在圆柱体的图像上方。我希望它会帮助你。再次感谢您的回复 :) drive.google.com/file/d/0B0d1J3S0T2RseWJsNVFFZmFGMmM/…

标签: opencv video position processing foreground


【解决方案1】:

您将不得不从小处着手,并且必须将您的问题分解为一个更简单的草图。现在你有很多事情要做:播放视频文件、相机捕捉、串行传感器、图像遮罩和 OpenCV 逻辑。一次调试太多了。

相反,创建一个只做一件事的小得多的示例草图。从一个简单地显示视频播放的草图开始。当你开始工作时,然后添加将视频用作纹理的逻辑。

这是一个示例MCVE,它展示了如何将视频用作纹理:

import processing.video.*;

Movie movie;

void setup() {
  size(500, 500, P3D);
  frameRate(30);
  movie = new Movie(this, "DSC_1940.MOV");
  movie.loop();
}

void draw() { 
  
  background(0);

  beginShape();
  texture(movie);

  vertex(mouseX, mouseY, 0, 0);
  vertex(400, 100, movie.width, 0);
  vertex(400, 400, movie.width, movie.height);
  vertex(100, 400, 0, movie.height);

  endShape();
}

void movieEvent(Movie myMovie) {
  myMovie.read();
}

请注意,这比您的代码要简单得多,而且一次只做一件事。从这样的事情开始,并尝试尽可能多地进行硬编码。我们不需要查看您的序列号,如果可能,我们也不需要查看您的网络摄像头或 OpenCV 中的任何内容。

获取此示例草图并添加逻辑以使用图像蒙版,或使用圆柱体而不是正方形。 (但同样,不要包含任何与您的问题没有直接关系的逻辑!)然后,当您遇到困难时,您可以将其作为 MCVE 发布到新问题中。祝你好运。

编辑

如果您想要做的只是屏蔽图像,那么您可以简单地使用PImage::mask() 函数。更多信息可以在 the reference 中找到,但应该像在代码中调用 img.mask(masque) 一样简单:

img = loadImage("berlin-1.jpg");
masque = loadImage("mask.png");
img.mask(masque);

那么您应该可以使用img 作为纹理,并且已经应用​​了遮罩。

但是,您的 .png 文件似乎不能用作掩码!如果我使用图像遮罩示例中的 mask.jpg 文件(在您的处理编辑器中,转到 @987654330 @,然后转到Sketch &gt; Show Sketch Folder,,然后在data 目录中找到mask.jpg)或者如果我将您的.png 文件保存为.jpg 文件,它可以正常工作。

如果我将示例 mask.jpg 文件保存为 .png 文件,它可以正常工作。所以你的文件特别有问题。

【讨论】:

  • 嗨,凯文,再次感谢您的回复和帮助。我给了你下载草图的链接(带有数据文件夹),我用照片而不是我想使用的纹理和蒙版的视频来隔离问题。谢谢亚历山大
  • @Alexandre 我位于阻止您下载链接的防火墙后面。这就是我们要求您将所有内容都放入帖子本身的原因之一。但我的回答确实向您展示了如何使用电影作为纹理。如果您仍然无法使其正常工作,我建议在此基础上构建并发布一个带有更新的 MCVE 的新问题。祝你好运。
  • 嗨,Kevin,我使用 MCVE 编辑了我的问题,并添加了我正在使用的掩码类型。我希望会更好:)
  • @Alexandre 请查看我编辑的答案。您应该可以使用 PImage.mask() 函数,但您的 .png 掩码文件似乎有些问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多