最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

OpenCV中Grabcut算法的具體使用

 更新時間:2022年08月03日 14:55:11   作者:DDsoup  
本文主要介紹了OpenCV中Grabcut算法的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

Grabcut 算法主要運用于計算機視覺中的前背景分割,立體視覺和摳圖等。該算法利用了圖像中的紋理(顏色)信息和邊界(反差)信息,只要少量的用戶交互操作即可得到比較好的分割結果.

1. Grabcut 的目標和背景的模型是RGB三通道的混合高斯模型GMM;

2. Grab Cut為一個不斷進行分割估計和模型參數(shù)學習的交互迭代過程;

3. Grab Cut只需要提供背景區(qū)域的像素集就可以了。也就是說你只需要框選目標,那么在方框外的像素全部當成背景,這時候就可以對GMM進行建模和完成良好的分割了。即Grab Cut允許不完全的標注.

Grabcut 算法的基本步驟:

Grabcut的相關API:

void grabCut( InputArray img,           //輸入圖像,必須是8位3通道圖像,在處理過程中不會被修改
              InputOutputArray mask,    //掩碼圖像,用來確定哪些區(qū)域是背景,前景,可能是背景, 
                                          可能是前景等
                                        //mask既可以作為輸入也可以作為輸出。作為輸入時,mode要                                                    
                                          選擇GC_INIT_WITH_MASK (=1);
GCD_BGD (=0), 背景;GCD_FGD (=1),前景;GCD_PR_BGD (=2),可能是背景;GCD_PR_FGD(=3),可能是前景
                   
              Rect rect,                //包含前景的矩形,格式為(x, y, w, h)
              InputOutputArray bgdModel,//算法內部使用的數(shù)組,只需要創(chuàng)建大小為(1,65), 
                                          數(shù)據(jù)類型為np.float64的數(shù)組
              InputOutputArray fgdModel,//同上
              int iterCount,            //算法迭代的次數(shù)
              int mode = GC_EVAL        //用來指示grabCut函數(shù)進行什么操作
              // GC_INIT_WITH_RECT (=0),用矩形窗初始化GrabCut;
              // GC_INIT_WITH_MASK (=1),用掩碼圖像初始化GrabCut
            );

有關鼠標操作的兩個函數(shù):

void setMouseCallback( const string& winname,     //圖像視窗名稱
                       MouseCallback onMouse,     //鼠標響應函數(shù),監(jiān)視到鼠標操作后調用并處理相 
                                                    應動作
                       void* userdata = 0         //鼠標響應處理函數(shù)的ID,識別號
                     );
void OnMouseAction( int event,  // 代表了鼠標的各種操作
                    int x,      // 代表鼠標位于窗口的(x,y)坐標位置,即Point(x,y)
                    int y,      
                    int flags,  // 代表鼠標的拖拽事件,以及鍵盤鼠標聯(lián)合事件
                    void *ustc  // 標識了所響應的事件函數(shù)
                  );
int event:
 
#define CV_EVENT_MOUSEMOVE 0             //滑動
#define CV_EVENT_LBUTTONDOWN 1           //左鍵點擊
#define CV_EVENT_RBUTTONDOWN 2           //右鍵點擊
#define CV_EVENT_MBUTTONDOWN 3           //中鍵點擊
#define CV_EVENT_LBUTTONUP 4             //左鍵放開
#define CV_EVENT_RBUTTONUP 5             //右鍵放開
#define CV_EVENT_MBUTTONUP 6             //中鍵放開
#define CV_EVENT_LBUTTONDBLCLK 7         //左鍵雙擊
#define CV_EVENT_RBUTTONDBLCLK 8         //右鍵雙擊
#define CV_EVENT_MBUTTONDBLCLK 9         //中鍵雙擊
int flags:
 
#define CV_EVENT_FLAG_LBUTTON 1       //左鍵拖曳
#define CV_EVENT_FLAG_RBUTTON 2       //右鍵拖曳
#define CV_EVENT_FLAG_MBUTTON 4       //中鍵拖曳
#define CV_EVENT_FLAG_CTRLKEY 8       //(8~15)按Ctrl不放事件
#define CV_EVENT_FLAG_SHIFTKEY 16     //(16~31)按Shift不放事件
#define CV_EVENT_FLAG_ALTKEY 32       //(32~39)按Alt不放事件

Grabcut 算法的代碼示例:

#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>
#include <opencv2\opencv.hpp>
#include <math.h>
using namespace cv;
using namespace std;
 
 //grabcut算法
bool setMouse = false;    //判斷鼠標左鍵的狀態(tài)(up / down)
bool init;
Point pt;
Rect rect;
Mat srcImg, mask, bgModel, fgModel;
int numRun = 0;
void onMouse(int, int, int, int, void*);
void runGrabCut();
void showImage();
int main()
{
	srcImg = imread("tahiti.jpg");
	if (srcImg.empty())
	{
		printf("could not load image...\n");
		return -1;
	}
 
	imshow("源圖像", srcImg);
 
	mask.create(srcImg.size(), CV_8U);
	setMouseCallback("源圖像", onMouse, 0);
 
	while (1)
	{
		char c = (char)waitKey(0);
		if (c == ' ') {//選中矩形框后,按空格鍵執(zhí)行grabcut分割
			runGrabCut();
			numRun++;
			showImage();
			printf("current iteative times : %d\n", numRun);
		}
		if ((int)c == 27) {
			break;
		}
 
	}
	return 0;
}
 
void showImage()
{
	Mat result, binmask;
	binmask = mask & 1;				//進一步掩膜
	if (init)						//進一步摳出無效區(qū)域。鼠標按下,init變?yōu)閒alse
	{
		srcImg.copyTo(result, binmask);
	}
	else
	{
		result = srcImg.clone();
	}
	rectangle(result, rect, Scalar(0, 0, 255), 2, 8);
	imshow("源圖像", result);
}
 
void onMouse(int events, int x, int y, int flag, void *)
{
	if (x < 0 || y < 0 || x > srcImg.cols || y > srcImg.rows)	//無效區(qū)域
		return;
 
 
	if (events == EVENT_LBUTTONDOWN)
	{
		setMouse = true;
		pt.x = x;
		pt.y = y;
		init = false;
	}
	else if (events == EVENT_MOUSEMOVE)//鼠標只要動,就執(zhí)行一次
	{
		if (setMouse == true)			//鼠標左鍵按住,滑動
		{
			Point pt1;
			pt1.x = x;
			pt1.y = y;
			rect = Rect(pt, pt1);//定義矩形區(qū)域
			showImage();
			mask.setTo(Scalar::all(GC_BGD));//背景
			mask(rect).setTo(Scalar(GC_PR_FGD));//前景			    //對rect內部設置為可能的前景,外部設置為背景
		}
	}
	else if (events == EVENT_LBUTTONUP)
		setMouse = false;	        	//鼠標左鍵抬起
}
 
void runGrabCut()
{
	if (init)//鼠標按下,init變?yōu)閒alse
		grabCut(srcImg, mask, rect, bgModel, fgModel, 1);//第二次迭代,用mask初始化grabcut
	else
	{
		grabCut(srcImg, mask, rect, bgModel, fgModel, 1, GC_INIT_WITH_RECT);//用矩形窗初始化GrabCut
		init = true;
	}
}

到此這篇關于OpenCV中Grabcut算法的具體使用的文章就介紹到這了,更多相關OpenCV Grabcut算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • C語言if選擇結構語句詳解

    C語言if選擇結構語句詳解

    大家好,本篇文章主要講的是C語言if選擇結構語句詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • OpenGL實現(xiàn)貝塞爾曲線或曲面

    OpenGL實現(xiàn)貝塞爾曲線或曲面

    這篇文章主要為大家詳細介紹了OpenGL實現(xiàn)貝塞爾曲線或曲面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-04-04
  • C語言中sizeof函數(shù)的基本使用總結

    C語言中sizeof函數(shù)的基本使用總結

    這篇文章主要給大家介紹了關于C語言中sizeof函數(shù)的基本使用的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • 華為面試題數(shù)字大小寫轉換

    華為面試題數(shù)字大小寫轉換

    一個四位數(shù),如1024,1004,打印出他們的中文形式,如果一千零二十四,一千零四,大家參考使用吧
    2013-12-12
  • 解決了個困擾了2天的問題,定點運算問題

    解決了個困擾了2天的問題,定點運算問題

    本文主要講解定點運算問題,需要的朋友可以參考一下。
    2016-06-06
  • C++快速冪與大數(shù)取模算法示例

    C++快速冪與大數(shù)取模算法示例

    這篇文章主要介紹了C++快速冪算法和大數(shù)取模算法的示例,對C++程序員來說有一定的幫助,有需要的朋友可以參考借鑒,下面來一起看看。
    2016-08-08
  • C語言實現(xiàn)父進程主動終止子進程的方法總結

    C語言實現(xiàn)父進程主動終止子進程的方法總結

    一般的情況,子進程自己運行完后,執(zhí)行exit 或者return 后,父進程wait.  waitpid收回子進程,但子進程是一個循環(huán)等待狀態(tài)不主動退出,父進程可以采用文中介紹的幾種方法,需要的朋友可以參考下
    2023-10-10
  • OpenCV實現(xiàn)車牌字符分割(C++)

    OpenCV實現(xiàn)車牌字符分割(C++)

    這篇文章主要為大家詳細介紹了OpenCV實現(xiàn)車牌字符分割,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • C++實現(xiàn)水仙花數(shù)判斷實例

    C++實現(xiàn)水仙花數(shù)判斷實例

    大家好,本篇文章主要講的是C++實現(xiàn)水仙花數(shù)判斷實例,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2022-01-01
  • OpenCV選擇圖像中矩形區(qū)域并保存

    OpenCV選擇圖像中矩形區(qū)域并保存

    這篇文章主要為大家詳細介紹了OpenCV選擇圖像中矩形區(qū)域并保存的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評論

福泉市| 广元市| 馆陶县| 汉阴县| 乌拉特中旗| 天祝| 秦安县| 湾仔区| 秦安县| 缙云县| 石阡县| 吉安市| 富裕县| 上蔡县| 启东市| 青州市| 岗巴县| 武强县| 光泽县| 绥宁县| 微山县| 佛山市| 沂南县| 永川市| 陇南市| 阜康市| 玛沁县| 仁布县| 大新县| 聊城市| 星座| 金川县| 嫩江县| 江孜县| 郑州市| 陵水| 重庆市| 庆云县| 马龙县| 穆棱市| 华坪县|