在OpenCV for Java中应用掩码过滤Mat对象

在OpenCV for Java中应用掩码过滤Mat对象,java,opencv,Java,Opencv,我正在尝试对照片应用遮罩: Mat img = Highgui.imread( "/path/to/my/image.png" ); Mat mask = new Mat( new Size( img.cols(), img.rows() ), CvType.CV_8UC1 ); mask.setTo( new Scalar( 0.0 ) ); // Rect r = ...; Core.ellipse( mask, new Point( r.x + ( r.width / 2 ), r.y

我正在尝试对照片应用遮罩:

Mat img = Highgui.imread( "/path/to/my/image.png" );

Mat mask = new Mat( new Size( img.cols(), img.rows() ), CvType.CV_8UC1 );
mask.setTo( new Scalar( 0.0 ) );

// Rect r = ...;
Core.ellipse( mask, new Point( r.x + ( r.width / 2 ), r.y + ( r.height / 2 ) ), new Size( r.width / 2, ( r.height ) / 2 ), 0.0, 0.0, 360.0, new Scalar( 255.0 ), 5 );

// Mat res = ...;
img.copyTo( res, mask );
但我最终得到的res总是包含与img完全相同的图像…

图像示例:

1.使用源图像的大小创建遮罩: 2.绘制遮罩垫(将厚度设置为-1以填充形状):

3.应用遮罩: 图像示例:

1.使用源图像的大小创建遮罩: 2.绘制遮罩垫(将厚度设置为-1以填充形状):

3.应用遮罩:

您是否检查了遮罩(其边框是否包含0个值)?作为另一种检查,您可以尝试:
matres=img.mul(mask)我不熟悉OpenCV和图像处理。。。mask.setTo(新标量(0.0))不应该这样做吗?是的!但是,也许你的椭圆绘图只是画了一个太大的椭圆,等等。所以请将遮罩保存到一个文件中并查看:)。我保存了图像并检查了它:椭圆只在底部碰到边界-这会是一个问题吗?不,如果遮罩中有真正为0的像素,它们在copyTo操作中不应该受到影响。您是否尝试过我的替代方法res=img.mul(掩码)?您是否检查了掩码(它是否在边界处包含0个值)?作为另一种检查,您可以尝试:
matres=img.mul(mask)我不熟悉OpenCV和图像处理。。。mask.setTo(新标量(0.0))不应该这样做吗?是的!但是,也许你的椭圆绘图只是画了一个太大的椭圆,等等。所以请将遮罩保存到一个文件中并查看:)。我保存了图像并检查了它:椭圆只在底部碰到边界-这会是一个问题吗?不,如果遮罩中有真正为0的像素,它们在copyTo操作中不应该受到影响。您是否尝试过我的替代方法res=img.mul(mask)?
Mat mask = new Mat(src.rows(), src.cols(), CvType.CV_8U, Scalar.all(0));
Imgproc.ellipse( mask,
                new Point( src.rows() / 2, src.cols() / 2 ),
                new Size( src.rows() / 3, src.cols() / 5 ),
                70.0,
                0.0,
                360.0,
                new Scalar( 255, 255, 255 ),
                -1,
                8,
                0 );
Mat cropped = new Mat();
src.copyTo( cropped, mask );