【问题标题】:Edge refinement OpenCV android边缘细化 OpenCV android
【发布时间】:2015-12-05 19:57:39
【问题描述】:

好的,所以我是opencv的新手,我已经设法执行了一个对我来说似乎“好的”的抓取,除了边缘非常变形,我想要获得逼真的边缘,也许模糊边缘以获得完美完成的图像,我注意到的另一件事是在我想将活力降低到可以接受的整个过程之后颜色往往太亮下面是我的代码

private Bitmap backGrndErase()
{

    color = new Scalar(255, 0, 0, 255);
    dst = new Mat();
    Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.myshirt);
    Log.d(TAG, "bitmap: " + bitmap.getWidth() + "x" + bitmap.getHeight());


    bitmap = ResizeImage.getResizedBitmap(bitmap, calculatePercentage(40, bitmap.getWidth()), calculatePercentage(40, bitmap.getHeight()));



    bitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);
    Log.d(TAG, "bitmap 8888: " + bitmap.getWidth() + "x" + bitmap.getHeight());



    Mat img = new Mat();
    Utils.bitmapToMat(bitmap, img);


    Point p1 = new Point((img.cols()/10), (img.rows()/10));
    Point p2 = new Point((img.cols()-img.cols()/10), (img.rows()-img.rows()/10));
    Rect rect = new Rect(p1,p2);

    int border = 20;
    int border2 = border + border;
    Rect rect2 = new Rect( border, border, img.cols() - border2, img.rows()-border2);




    Mat mask = new Mat();
    debugger(""+mask.type());
    mask.setTo(new Scalar(125));
    Mat fgdModel = new Mat();
    fgdModel.setTo(new Scalar(255, 255, 255));
    Mat bgdModel = new Mat();
    bgdModel.setTo(new Scalar(255, 255, 255));

    Mat imgC3 = new Mat();
    Imgproc.cvtColor(img, imgC3, Imgproc.COLOR_RGBA2RGB);
    Log.d(TAG, "imgC3: " + imgC3);
    Log.d(TAG, "Grabcut begins");
    Imgproc.grabCut(imgC3, mask, rect2, bgdModel, fgdModel, 2, Imgproc.GC_INIT_WITH_RECT);
    Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3.0));
    //Do Sth
    Core.compare(mask, source, mask, Core.CMP_EQ);
    //Do Sth
    Mat foreground = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255, 255, 255));
    img.copyTo(foreground, mask);
    Imgproc.rectangle(img, p1, p2, color);

    Mat background = new Mat();
    try {
        background = Utils.loadResource(getApplicationContext(),
                R.drawable.blackcolor );
    } catch (IOException e) {

        e.printStackTrace();
    }
    Mat tmp = new Mat();
    Imgproc.resize(background, tmp, img.size());

    background = tmp;

    Mat tempMask = new Mat(foreground.size(), CvType.CV_8UC1, new Scalar(255, 255, 255));
    Imgproc.cvtColor(foreground, tempMask, 6/* COLOR_BGR2GRAY */);


    Mat vals = new Mat(1, 1, CvType.CV_8UC3, new Scalar(0.0));
    dst = new Mat();
    background.setTo(vals, tempMask);
    Imgproc.resize(foreground, tmp, mask.size());
    foreground = tmp;
    Core.add(background, foreground, dst, tempMask);
    Log.d(TAG, "Convert to Bitmap");


    //removing blackbaground started

     Mat tmp2 = new Mat();
     Mat alpha = new Mat();
     Imgproc.cvtColor(dst, tmp2, Imgproc.COLOR_BGR2GRAY);
     Imgproc.threshold(tmp2, alpha, 100, 255, Imgproc.THRESH_BINARY);


     List<Mat> rgb = new ArrayList<Mat>(3);
     Core.split(dst, rgb);


     List<Mat> rgba = new ArrayList<Mat>(4);
     rgba.add(rgb.get(0));
     rgba.add(rgb.get(1));
     rgba.add(rgb.get(2));
     rgba.add(alpha);
     Core.merge(rgba, dst);
     Bitmap output = Bitmap.createBitmap(dst.width(), dst.height(), Bitmap.Config.ARGB_8888);
     Utils.matToBitmap(dst, output);

    //removing back ended


    Utils.matToBitmap(dst, bitmap);



    //release MAT part
    img.release();
    imgC3.release();
    mask.release();
    fgdModel.release();
    bgdModel.release();
    alreadyRun = true;
    return  bitmap;

}

我在 opencv 网站上发布了同样的问题,但与这里相比,那里的观众似乎很少,images

【问题讨论】:

    标签: android opencv


    【解决方案1】:

    一个试用代码只是为了显示您的问题的一些可能性(假设背景总是白色)

    #include "opencv2/opencv.hpp"
    
    using namespace cv;
    
    int main(int argc, char** argv)
    {
    Mat src= imread( argv[1] );
    Mat original = src.clone();
    
    imshow("source", src);
    
    src = src + Scalar(40,40,40); // to remove jpeg artifacts
    
    Mat mask;
    cvtColor( src, mask, COLOR_BGR2GRAY );
    
    mask = mask < 255;
    
    add(src,Scalar(0,60,20),src,mask);
    
    Mat blackbg = Mat::zeros(src.size(),CV_8UC3);
    original.copyTo( blackbg, mask);
    
    imshow("mask", mask);
    imshow("changed color", src);
    imshow("original image with black background", blackbg);
    waitKey();
    
    return 0;
    }
    

    【讨论】:

    • 这很好,但是我怎样才能保留原来的颜色,什么是背景不是白色的,我可以采取什么措施来确保它试图准确地从我的图片中提取出大部分颜色矩形?最后你用什么书,我从来没有想过opencv会这么好。
    • 我的所有图像的背景可能总是单一颜色,但可能是红色和深红色
    • 尝试更新代码。让我想想其他背景颜色。
    【解决方案2】:

    如果你想非常精确地检测边缘或角落,opencv 有一组亚像素分辨率工具,在边缘检测之前应用 gaussianFilter 可能是个好主意,它可以消除一些不需要的噪声

    【讨论】:

    【解决方案3】:

    试试这个代码。它对我有用

    public Bitmap removeBackground(Bitmap bitmap) {
        //GrabCut part
        Mat img = new Mat();
        Utils.bitmapToMat(bitmap, img);
    
        int r = img.rows();
        int c = img.cols();
        Point p1 = new Point(c / 100, r / 100);
        Point p2 = new Point(c - c / 100, r - r / 100);
        Rect rect = new Rect(p1, p2);
    
        Mat mask = new Mat();
        Mat fgdModel = new Mat();
        Mat bgdModel = new Mat();
    
        Mat imgC3 = new Mat();
        Imgproc.cvtColor(img, imgC3, Imgproc.COLOR_RGBA2RGB);
    
        Imgproc.grabCut(imgC3, mask, rect, bgdModel, fgdModel, 5, Imgproc.
                GC_INIT_WITH_RECT);
    
        Mat source = new Mat(1, 1, CvType.CV_8U, new Scalar(3.0));
        Core.compare(mask, source/* GC_PR_FGD */, mask, Core.CMP_EQ);
    
        //This is important. You must use Scalar(255,255, 255,255), not Scalar(255,255,255)
        Mat foreground = new Mat(img.size(), CvType.CV_8UC3, new Scalar(255,
                255, 255,255));
        img.copyTo(foreground, mask);
    
        // convert matrix to output bitmap
        bitmap = Bitmap.createBitmap((int) foreground.size().width,
                (int) foreground.size().height,
                Bitmap.Config.ARGB_8888);
        Utils.matToBitmap(foreground, bitmap);
        return bitmap;
    }

    【讨论】:

      猜你喜欢
      • 2017-07-06
      • 2017-01-02
      • 1970-01-01
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 2010-10-28
      • 2012-01-28
      • 1970-01-01
      相关资源
      最近更新 更多