有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

opencv java中的python掩码图像

我需要将近白色像素转换为白色,将近黑色像素转换为黑色

我在python中找到了一段关于如何操作的代码片段

hsv=cv.cvtColor(image,cv.COLOR_BGR2HSV)
# Define lower and upper limits of what we call "brown"
brown_lo=np.array([10,0,0])
brown_hi=np.array([20,255,255])
# Mask image to only select browns
mask=cv.inRange(hsv,brown_lo,brown_hi)
# Change image to red where we found brown
image[mask>0]=(0,0,255)

我将其转换为java,如下所示

Mat temp= new Mat();
Imgproc.cvtColor(src,temp,COLOR_BGR2HSV);
Scalar low= new Scalar(10,0,0);
Scalar high= new Scalar(20,255,255);
Mat mask = new Mat();
inRange(temp,low,high,mask);

但我在将下面的语句转换为java时遇到了问题,而且java中没有带示例的好opencv文档

image[mask>0]=(0,0,255)

有人能帮忙把上面的语句转换成java吗

我已经尝试过setTo,但它没有给出想要的行为(下面附上的屏幕截图)。有关预期结果,请参阅https://stackoverflow.com/a/50215020/12643143

src.setTo(new Scalar(0,0,255),mask);


共 (1) 个答案

  1. # 1 楼答案

    问题的答案

    正如@rabbi76所提到的,{}是正确的方法。但是,如果您想要像image[mask>127]=(0,0,255)这样的特定逻辑,那么请执行阈值(Imgproc.threshold(grey,grey, 127, 255, THRESH_BINARY);),然后使用setTo

    我问题的解决方案

    实际上,我的问题不是因为setTo。这是我在代码中读/写Mat与我引用的帖子之间的逻辑不匹配

    我正在发布我所面临的问题的解决方案,以帮助像我这样的新蜜蜂

    读取图像时出现问题

    post使用Imgcodecs.imread()以BGR格式将图像读取到Mat

    而我正在使用CV_8UC4类型中的bitmapToMat加载位图,如下所示,它以RGBA格式将图像读取到Mat

    Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CV_8UC4);
    org.opencv.android.Utils.bitmapToMat(bitmap, src);
    

    修复方法是正确转换格式

    Mat src = new Mat(bitmap.getHeight(), bitmap.getWidth(), CV_8UC3); //notice 3 channel
    org.opencv.android.Utils.bitmapToMat(bitmap, src);
    Imgproc.cvtColor(src,hsv,COLOR_RGB2HSV); //Convert RGB to HSV. COLOR_RGBA2HSV not exist, hence we load it in CV_8UC3(3 channel R,G,B).
    

    书写图像时出现问题

    同样地,正如我们在bitmapToMatimread之间的阅读上存在差异,同样的情况也适用于写作Imgcodecs.imwrite()将BGR图像写入位图,在这里我必须将其转换回RGB格式,以便matToBitmapImgproc.cvtColor(rgb, rgb, Imgproc.COLOR_BGR2RGB);一样工作