2016年1月20日 星期三

[OpenCV C++] GrabCut 介紹

        OpenCV 中的GrabCut算法是依據《"GrabCut" - Interactive Foreground Extraction using Iterated Graph Cuts》這篇文章來實現的。該算法利用了圖像中的顏色和邊界,只要少量的交互操作即可得到比較好的分割結果。

            GrabCut,主要功能是分割前景和背景。
         1)你只需要在目標外面畫一​​個框,把目標框住,它就可以完成良好的分割:

  2)如果增加額外的用戶交互(利用標記來指定前背景),那麼效果就可以更完美:

缺點
1.          如果背景比較複  雜或者背景和目標相似度很大,那分割就不太好了
2.          速度有點慢。

             GrabCut 函式定義
void grabCut(InputArray img, InputOutputArray mask, Rect rect,
                             InputOutputArray bgdModel, InputOutputArray fgdModel,
                             int iterCount, int mode=GC_EVAL )
            img:待分割的來源圖,必须是83通道(CV_8UC3)图像,在處理過程中不會被修改;
           mask:遮掩圖像,大小和原圖一致。可以有如下幾種參數:
                    GC_BGD=0),背景;
                    GC_FGD=1),前景;
                    GC_PR_BGD=2),可能的背景;
                    GC_PR_FGD=3),可能的前景。
             rect:限定需要進行分割的圖像範圍,只有該矩形內部可以進行處理
             bgdModel:背景模型,如果為null,函数内部會自己創建一個bgdModel(背景模組)
             fgdModel:前景模型,如果為null,函数内部會自己創建一個fgdModel(前景模組)
             iterCount:迭代次數,必须大於0(越高分越準,但會影響處理時間)
             mode:用於指示grabCut函式進行什麼操作。可以有如下幾種選擇:
                    GC_INIT_WITH_RECT=0),用矩形窗初始化GrabCut
                    GC_INIT_WITH_MASK=1),用被遮蓋的圖初始化GrabCut








沒有留言:

張貼留言