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