处理:如何将图像设置为前景

时间:2016-09-13 14:11:24

标签: opencv video position processing foreground

我想知道是否有人可以帮助我使用处理将图像设置到前台。 我有一个草图,其中视频以连续循环显示,在此视频上方,有一个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

1 个答案:

答案 0 :(得分:0)

你必须从小做起,而且你必须将你的问题分离成一个更简单的草图。现在你已经有很多事情要做:播放视频文件,摄像头捕捉,串行传感器,图像屏蔽和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文件(在您的处理中)编辑器,转到File > Examples > Image > Alphamask,然后转到Sketch > Show Sketch Folder,,然后在mask.jpg目录中找到data,或者如果我将.png文件保存为{{1}它可以正常工作。

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