2017-08-17 234 views
0

我现在有手部检测代码,当检测到手部时会在手部周围创建一个绿色矩形。但是,我想用另一个jpeg图像填充矩形。我正在考虑使用ImagePattern将图像嵌入到形状中,但在我的程序中似乎不起作用。将jpg图像加载到mat frame opencv java

这是我的用于创建围绕手的矩形代码:

Imgproc.rectangle(frame, handsArray[i].tl(), handsArray[i].br(), new Scalar(0, 255, 0), 3); 

该帧是垫子和Imgproc是OpenCV的,javacv功能。

有人可以帮我解决这个问题吗?我奋力

问候

Green Rectangle Around The Hand that needs to be filled

BufferedImage bi = null; 
    try { 
     bi = ImageIO.read(new File(trollFace)); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    Mat mat = new Mat(bi.getHeight(), bi.getWidth(), CvType.CV_8UC3); 
    byte[] data = ((DataBufferByte) bi.getRaster().getDataBuffer()).getData(); 
    mat.put(0, 0, data); 

回答

1

你可以做到这一点,在这些步骤:

  1. 子阵列的矩形从您的源图像

    垫子阵列= SRC .submat(新Rect(200,200,100,100));

  2. 现在sencond图像复制到子阵列

    src2.copyTo(子阵列);

注:复制之前,确保第二图像的大小是一样的矩形,如果没有可以使用Imgprc类的resize()功能调整垫。就是这样。

更新:下面是例子。

Mat src = Imgcodecs.imread("C:\\src1.jpg"); 
Mat src2 = Imgcodecs.imread("C:\\src2.jpg"); 
Imgproc.resize(src2, src2, new Size(100, 100)); 
Mat submat = src.submat(new Rect(200, 200, 100, 100)); 
src2.copyTo(submat); 

// now you can do what you want with the src1 
+0

我试图实现你所说的。首先,我将jpg转换为一个bufferedImage,然后转换为一个mat(因为源图像'frame'是一个mat)。所以src是frame,src2是转换后的bufferImage。我不知道自己做错了什么,但图像仍未显示。请向上滚动以查看我是如何制作Mat src2 – hahahahahahahah

+0

您不需要使用Java ImageIO来读取图像文件,就可以使用OpenCV'Imgcodecs'类读取和写入图像。现在更新你的问题了。请注意,OpenCV中的所有图像格式必须是Mat对象,BufferedImage不是OpenCV数据类型。 –

+0

非常感谢!我将试验并阅读更多关于此的信息,以便我可以将图片背景的加载透明 – hahahahahahahah