设置一个新的掩码抓取JAVA

时间:2015-10-11 23:14:53

标签: java opencv mask

我应该如何应用抓取但是使用INIT_WITH_RECT,使用INTI_WITH_MASK?到目前为止,我得到的是这个,可能有图像,你可以看到我真正的问题:

首先,您可以选择所需的零件作为ROI,在这种情况下,所选零件标记为灰色矩形:

enter image description here 使用INIT_WITH_RECT应用grabcut算法显示:

enter image description here

我在第一个抓取操作中使用的代码是:

    Rect selection = new Rect(x1,y1,x2,y2);
    Mat mask = new Mat();;
    Mat cmp = new Mat(1, 1, CvType.CV_8U, new Scalar(3));
    Mat bkground; 
    Mat frground;
    Mat foreground;//keep the result of the grabcut

   Imgproc.grabCut(imagen, mask,selection, bkground,
   frground,5,Imgproc.GC_INIT_WITH_RECT);
   Core.compare(mask, cmp,cmp, Core.CMP_EQ);
   foreground = newMat(imagen.size(),CvType.CV_8UC3,newScalar(0,0,0));
   imagen.copyTo(foreground,mask);

正如你所看到的那样,抓取选择一个不需要的部分,所以我试图通过在你想要的部分中作为前景和背景进行一些修饰来增强选择,在这个例子中,前景是用蓝色和背景标记红色如下:

enter image description here

问题是,如何再次应用抓取算法但现在指示蓝线是前景而红线是背景?我已经阅读了它并看到了Python示例,但在Python中,数组的使用与Java有很大不同。

我知道并纠正我如果我错了,我必须修改掩码并重新应用抓取算法,我试过这个,在抓取的结果图像中(在这个例子中变量名称是“前景”) “)我发现我标记为红色或蓝色的颜色并更改了蒙版图像中的值,前景的对应值为1,背景为0:

paintit = bufferedtoMat(foreground);
totalbytes = (int) (paintit.total() * paintit.elemSize());
byte buffer[] = new byte [totalbytes];
                    /**********************************************************/
 int totalbytesMask = (int) (mask.total() * mask.elemSize());
 byte maskBuffer[] = new byte[totalbytesMask];
 Mat newMask = new Mat(mask.height(),mask.width(),CvType.CV_8UC1);
                    /*********************************************************/


  paintit.get(0,0,buffer);
  mask.get(0, 0,maskBuffer);

  for(i = 0; i < totalbytes; i = i+3)
  {
       for(int j = i ; j < i+3; j++)
       {
          tmpBlue[h] =(buffer[j] & 255);
          tmpRed[h] = (buffer [j] & 255);
          h++;
       }

                       h = 0;

                       for(int k = 0; k < blue.length; k++)
                       {

                           if(tmpBlue[k] == blue[k])
                           {

                               flagBlue++;
                           }
                           else
                           {
                               flagBlue = 0;
                           }


                           if(tmpRed[k] == red[k])
                           {

                               flagRed++;


                           }
                           else
                           {
                               flagRed = 0;

                           }


                       }
                       if(flagBlue == blue.length)
                       {

                           for(int l = i; l < blue.length;l++)
                           {

                               maskBuffer[l] = azul;
                               buffer[l] = azul;
                           }

                           System.out.println("Hay un azul...");
                           flagBlue = 0;

                       }
                       if(flagRed == red.length)
                       {

                           for(int m = i; m < red.length;m++)
                           {

                               maskBuffer[m] = rojo;
                               buffer[m] = rojo;

                           }


                           System.out.println("Hay un rojo...");
                           flagRed= 0;


                       }





                   }

                   paintit.put(0,0,buffer);
                   mask.put(0,0,maskBuffer);

完成所有操作并更改了遮罩后,我尝试再次应用抓取操作:

Imgproc.grabCut(source,mask,rectangle,background,forground,5,Imgproc.GC_INIT_WITH_MASK);

但我收到了这个错误:

Assertion failed (!bgdSamples.empty() && !fgdSamples.empty()) in initGMMs

我检查过这个矩阵不为零或它们存在且结果如下:

Mask:Mat [ 494*954*CV_8UC1, isCont=true, isSubmat=false, nativeObj=0x1d140a00, dataAddr=0x1d211f20 ]
Background:Mat [ 1*65*CV_64FC1, isCont=true, isSubmat=false, nativeObj=0x1d1404c0, dataAddr=0x390b00 ]
ForegroundMat [ 1*65*CV_64FC1, isCont=true, isSubmat=false, nativeObj=0x1d140450, dataAddr=0x3908d0 ]
Rectangle{252, 235, 345x342}

所以问题是如何设置新面具?

1 个答案:

答案 0 :(得分:0)

当背景或前景没有值时会发生错误。

在设置值时,您可以将所有像素值设置为Foreground,即1或3,或者将所有像素值设置为背景,即0或2。

检查像素值以了解错误。