grabcut分割算法簡單且效果較好,初步決定將其應用到項目中,爲了省去其人機交互的部分考慮到圖像的顯著性,查看的基本方法大多涉及機器學習。由於我們的項目待處理圖像較爲規整,於是想到每幅圖片均提取相同的矩形區域,爲grabcut算法提供先驗像素。具體代碼如下:
#include"highgui.h"
#include"cv.h"
using namespace cv;
Rect selection;
Mat img,img0;
int main()
{
Mat srcMarks;
img = imread("1.jpg");
imshow("原圖", img);
img0 = img.clone();
//繪製合適大小的矩形區域:
selection = cv::Rect(20,150,850,300);img.copyTo(srcMarks);
cv::rectangle(srcMarks, selection, cv::Scalar(255, 0, 0),1,1,0);
imshow("srcMarks",srcMarks);
waitKey(100);
Mat result; // 4種可能結果
Mat bgModel, fgModel; // 背景/前景
grabCut(srcMarks, result, selection, bgModel, fgModel, 5, GC_INIT_WITH_RECT);
compare(result,GC_PR_FGD,result,CMP_EQ);//得到前景mask
Mat foreground(img.size(),CV_8UC3,Scalar::all(255));
img0.copyTo(foreground,result);
imshow("grabcut",foreground);
waitKey();
}
初步實現了我們的想法,仍存在的問題:
1、圖片素材大小不一,需預先將所有圖像大小標準化。
2、速度較慢。