2015-12-05 7 views
5

ठीक तो मैं एक नौसिखिया OpenCV के लिए कर रहा हूँ, मैं एक grabcut जो मेरे लिए "ठीक है" लगता है, सिवाय इसके किनारों सुंदर आकार से बाहर हैं, मैं यथार्थवादी किनारों पाने के लिए, हो सकता है किनारों को धुंधला चाहते प्रदर्शन करने के लिए प्रबंधन है बाहर एक पूरी तरह से किया छवि प्राप्त करने, एक और बात मैंने देखा है रंग बहुत उज्ज्वल पूरी प्रक्रिया के बाद मैं जीवंतता कुछ हद तक नीचे स्वीकार्य को कम करने के लिए करना चाहता था हो जाते हैं मेरे कोड हैएज शोधन 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; 

} 

मैं एक ही पोस्ट किया है ओपनसीवी साइट पर सवाल है, लेकिन यहां तुलना में कम दर्शक दिखते हैं, छवियां my output image, if you look you can see that my output is too vibrant and very bad edges

my input image

I tried it on another image and still got the same over vibrant effect

उत्तर

7

एक परीक्षण कोड सिर्फ अपने प्रश्न के आसपास कुछ संभावनाओं को दिखाने के लिए (पृष्ठभूमि संभालने हमेशा सफेद हो जाएगा)

#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; 
} 

enter image description hereenter image description hereenter image description here

+0

यह बहुत अच्छा है, लेकिन मैं कैसे मूल रंग बनाए रख सकते हैं और क्या पृष्ठभूमि है सफेद नहीं है, क्या उपायों मैं रख सकते हैं यह pic की कोशिश करता है सुनिश्चित करने के लिए मेरे आयत से सटीक रूप से अधिकांश रंग? और आखिरकार आप किस पुस्तक का उपयोग करते हैं, मैंने कभी भी यह अच्छा नहीं होने के लिए ओपनसीवी की कल्पना की। –

+0

संभावनाएं मेरी सभी छवियों के लिए हैं पृष्ठभूमि हमेशा एक रंग होगी, लेकिन शायद यह लाल और गहरा लाल –

+0

अपडेट कोड का प्रयास करेगा। मुझे अन्य बीजी रंगों के बारे में सोचने दो। – sturkmen

0

आप पता लगाने के लिए चाहते हैं किनारों या कोनों को बहुत सटीक रूप से opencv में एक सेट ओ उप-पिक्सेल रिज़ॉल्यूशन उपकरण हैं, और किनारे का पता लगाने से पहले एक gaussianFilter को लागू करना एक अच्छा विचार हो सकता है , कि कुछ अवांछनीय शोर

+0

मैंने अपना अधिकांश कोड अपडेट किया है, यहां नया धागा है http://stackoverflow.com/questions/33977051/opencv-increasing-accuracy-of-threshold –

0

मिटा इस कोड का प्रयास करें। यह मेरे लिए काम कर

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; 
 
}