opencv圖像前景目標提取

1、功能

     論文圖片處理需要用到簡單的前景目標提取,這裏採用opencv的grabCut函數;

     前期可以採用selectROI獲取矩形框(需要添加contrib庫),也可以手動設定rect;

     添加了一個圖片批處理操作,glob函數獲取文件夾的圖片。

     本文運行環境爲VS2017+OPENCV4.0.1.

2、代碼

#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <iostream>  

using namespace std;
using namespace cv;

int main()
{
	String path = "F:\\插值光流\\RLOF\\RLOFLib-master\\RLOFLib-master\\Doc\\花開動圖\\紅花\\";//待處理
	String dest = "F:\\插值光流\\RLOF\\RLOFLib-master\\RLOFLib-master\\Doc\\花開動圖\\紅花2\\";//處理後
	String savedfilename;
	vector<cv::String> filenames;
	Mat srcImg;
	//手動設置前景所在區域位置
	Rect r = cv::Rect(103, 17, 335, 254);

	cv::glob(path, filenames);
	for (int i = 0; i < filenames.size(); i++) //filenames.size()
	{
		srcImg = imread(filenames[i]);
		std::cout << filenames[i] << std::endl;
		Mat mask;

		Mat bgModel, fgModel; // 模型(內部使用)  
		grabCut(srcImg, mask, r, bgModel, fgModel, 1, cv::GC_INIT_WITH_RECT);

		// 得到可能爲前景的像素  
		compare(mask, GC_PR_FGD, mask, cv::CMP_EQ);
		//imshow("mask", mask);

		// 生成輸出圖像  
		Mat foreground(srcImg.size(), CV_8UC3, cv::Scalar(0, 0, 0));//背景爲黑色
		srcImg.copyTo(foreground, mask); // 複製背景數據  

		// 輸出前景圖像結果  
		//cv::imshow("提取後", foreground);
		//imwrite("20_1.png", foreground);//存到本地
		savedfilename = dest + filenames[i].substr(65);

		std::cout << savedfilename << std::endl;
		imwrite(savedfilename, foreground);
	}
	return 0;
}

3、參考 

https://blog.csdn.net/zmdsjtu/article/details/78051804

https://blog.csdn.net/if_i_die_young/article/details/85263256

批處理

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章