Android中基于Java的OpenCV:希望仅在掩码具有非零值的情况下将一个图像重叠到另一个图像上

Android中基于Java的OpenCV:希望仅在掩码具有非零值的情况下将一个图像重叠到另一个图像上,java,android,opencv,Java,Android,Opencv,我知道我的问题是一个相当基本的问题,但我尝试了几天来解决这个问题,也找不到关于Stackoverflow的问题的确切答案 我有一个背景图像,我想把前景图像重叠到它上面,但只在遮罩非零的区域 价值观我写的代码如下。前景图像显示在中 遮罩具有非零值的区域(位于遮罩的左上四分之一) 整个图像区域),但在图像的其余部分,背景不会出现,只是显示为“黑色” 如果有人能帮忙,我将不胜感激 解决这个问题。类似的代码适用于C语言的OpenCV 背景图像(background.bmp)和前景图像(foregroun

我知道我的问题是一个相当基本的问题,但我尝试了几天来解决这个问题,也找不到关于Stackoverflow的问题的确切答案

我有一个背景图像,我想把前景图像重叠到它上面,但只在遮罩非零的区域 价值观我写的代码如下。前景图像显示在中 遮罩具有非零值的区域(位于遮罩的左上四分之一) 整个图像区域),但在图像的其余部分,背景不会出现,只是显示为“黑色”

如果有人能帮忙,我将不胜感激 解决这个问题。类似的代码适用于C语言的OpenCV

背景图像(background.bmp)和前景图像(foreground.bmp), 正在毫无问题地读取(我已验证)


setContentView(R.layout.activity\u main);
串路径背景
=Environment.getExternalStorageDirectory()+“/background.bmp”;
地面线路径
=Environment.getExternalStorageDirectory()+“/foreground.bmp”;
席前景;
垫子背景;
背景=imread(路径背景);//读入背景图像
前台=imread(路径前方);//读入前景图像
位图返回\位图=位图工厂.decodeFile(路径+“/background.bmp”);
Utils.bitmapToMat(后位图,背景);//从位图转换为Mat
Mat mask2=
新垫(新尺寸(前台.cols(),前台.rows()),CvType.CV_8UC1);
mask2.setTo(新标量(0));//将遮罩设置为全零
Size sizeMask=mask2.Size();

对于(int i=0;i多亏了‘Rick M’的注释,我可以通过以下代码解决问题(虽然不是很整洁)。我制作了一个空位图(“back_bitmap”),而不是 将初始图像放入其中。结果如所示。 在我看不到背景图像之前

    setContentView(R.layout.activity_main);

    String pathToBackground  = 
                Environment.getExternalStorageDirectory()+"/background.bmp";
    String pathToForeground  = 
                Environment.getExternalStorageDirectory()+"/foreground.bmp";

    Mat foreground;
    Mat background;
    background = imread(pathToBackground);
    foreground = imread(pathToForeground);

    Bitmap back_bitmap 
    = Bitmap.createBitmap(foreground.cols(), foreground.rows(), 
      Bitmap.Config.ARGB_8888);  // Make an empty Bitmap

   Mat mask2 
   = new Mat( new Size( foreground.cols(), foreground.rows() ), 
                   CvType.CV_8UC1 );
    mask2.setTo( new Scalar( 0 ) );

    Size sizeMask = mask2.size();
    double[] data;
       for (int i=0;i<sizeMask.height;i++ )
         for (int j=0;j<sizeMask.width;j++ ) {
             data = foreground.get(i, j);
             if (data[0] + data[1] + data[2] > 0)
                 mask2.put(i, j, 10);
         }
    foreground.copyTo(background, mask2);
    Utils.matToBitmap(background, back_bitmap);
    ImageView v = (ImageView)findViewById(R.id.imageView);
    v.setImageBitmap(back_bitmap);
    }
   }
setContentView(R.layout.activity\u main);
字符串路径背景=
Environment.getExternalStorageDirectory()+“/background.bmp”;
字符串pathToForeground=
Environment.getExternalStorageDirectory()+“/foreground.bmp”;
席前景;
垫子背景;
背景=imread(路径背景);
前台=imread(路径到前台);
返回位图
=Bitmap.createBitmap(前台.cols(),前台.rows(),
Bitmap.Config.ARGB_8888);//制作一个空位图
Mat mask2
=新垫(新尺寸(前台.cols(),前台.rows()),
CvType.CV_8UC1);
设为(新标量(0));
Size sizeMask=mask2.Size();
双[]数据;

对于(int i=0;我几乎可以肯定,使用
PorterDuff.Mode
类将使它变得更容易。您可以附加示例输入和输出吗?非常感谢您的快速回复。我现在在谷歌上搜索PorterDuff.Mode。我使用Java OpenCV的原因是,将来我想扩展代码,将图像重叠到通过手机相机。但是无论如何,我想我也必须考虑PouldDuff.Moad。我很快会把输入和输出图像附加起来。我会做一个空的垫子,它是原始图像的大小,然后根据你想要的东西来放值。然后你可以把垫子改成位图。
    setContentView(R.layout.activity_main);

    String pathToBackground  = 
                Environment.getExternalStorageDirectory()+"/background.bmp";
    String pathToForeground  = 
                Environment.getExternalStorageDirectory()+"/foreground.bmp";

    Mat foreground;
    Mat background;
    background = imread(pathToBackground);
    foreground = imread(pathToForeground);

    Bitmap back_bitmap 
    = Bitmap.createBitmap(foreground.cols(), foreground.rows(), 
      Bitmap.Config.ARGB_8888);  // Make an empty Bitmap

   Mat mask2 
   = new Mat( new Size( foreground.cols(), foreground.rows() ), 
                   CvType.CV_8UC1 );
    mask2.setTo( new Scalar( 0 ) );

    Size sizeMask = mask2.size();
    double[] data;
       for (int i=0;i<sizeMask.height;i++ )
         for (int j=0;j<sizeMask.width;j++ ) {
             data = foreground.get(i, j);
             if (data[0] + data[1] + data[2] > 0)
                 mask2.put(i, j, 10);
         }
    foreground.copyTo(background, mask2);
    Utils.matToBitmap(background, back_bitmap);
    ImageView v = (ImageView)findViewById(R.id.imageView);
    v.setImageBitmap(back_bitmap);
    }
   }