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

OpenCV使用GrabCut實現(xiàn)摳圖功能

 更新時間:2023年02月19日 11:08:42   作者:音視頻開發(fā)老舅  
Grabcut是基于圖割(graph cut)實現(xiàn)的圖像分割算法,它需要用戶輸入一個bounding box作為分割目標位置,實現(xiàn)對目標與背景的分離/分割。本文將使用GrabCut實現(xiàn)摳圖功能,需要的可以參考一下

1、概述

案例:使用OpenCV的GrapCut實現(xiàn)有用戶交互的摳圖

grabCut( InputArray img, InputOutputArray mask, Rect rect,
                           InputOutputArray bgdModel, InputOutputArray fgdModel,
                           int iterCount, int mode = GC_EVAL );
  • img --> 輸入的三通道圖像;
  • mask --> 輸入的單通道圖像,初始化方式為GC_INIT_WITH_RECT表示ROI區(qū)域可以被初始化為:
  • GC_BGD --> 定義為明顯的背景像素 0
  • GC_FGD --> 定義為明顯的前景像素 1
  • GC_PR_BGD --> 定義為可能的背景像素 2
  • GC_PR_FGD --> 定義為可能的前景像素 3
  • rect --> 表示roi區(qū)域;
  • bgdModel --> 表示臨時背景模型數(shù)組;
  • fgdModel --> 表示臨時前景模型數(shù)組;
  • iterCount --> 表示圖割算法迭代次數(shù), 次數(shù)越多,效果越好;
  • mode --> 當使用用戶提供的roi時候使用GC_INIT_WITH_RECT

實現(xiàn)算法的步驟:

1.創(chuàng)建一個遮罩,并初始化為背景GC_BGD

2.用戶選定一個ROI區(qū)域初始化為前景GC_FGD

3.調(diào)用grabCut函數(shù)實現(xiàn)算法

4.輸入mask即為目標摳圖

2、代碼示例

(這個例子不完善,圖像的顏色輸出有問題,先記錄一下,后面改正。但是不影響整個算法的流程及效果,僅僅是RGB和BGR像素通道的問題)

CrabCut_Matting::CrabCut_Matting(QWidget *parent)
    : MyGraphicsView{parent}
{
    this->setWindowTitle("crabCut摳圖");
    this->setMouseTracking(true);//設(shè)置鼠標事件可用
    init = false;
    numRun = false;
}
 
 
void CrabCut_Matting::dropEvent(QDropEvent*event){
    QString filePath = event->mimeData()->urls().at(0).toLocalFile();
    showCrabCutMatting(filePath.toStdString().c_str());
}
 
void CrabCut_Matting::showCrabCutMatting(const char* filePath){
    src = imread(filePath);
    if(src.empty()){
        qDebug()<<"輸入圖像為空";
        return;
    }
 
    //創(chuàng)建一個背景遮罩
    mMask = Mat::zeros(src.size(),CV_8UC1);
    mMask.setTo(Scalar::all(GC_BGD));
 
 
    convert2Sence(src);
}
void CrabCut_Matting::mouseMoveEvent(QMouseEvent *event){
    //    if(event->button()==Qt::LeftButton){//鼠標左鍵
    rect = Rect(Point(rect.x, rect.y), Point(event->pos().x(), event->pos().y()));
    qDebug()<<"mouseMoveEvent:"<<rect.width<<"|"<<rect.height;
    showImage();
    //    }
}
 
void CrabCut_Matting::mousePressEvent(QMouseEvent *event){
    grabMouse();
    if(event->button()==Qt::LeftButton){//鼠標左鍵
        rect.x = event->pos().x();
        rect.y = event->pos().y();
        rect.width = 1;
        rect.height = 1;
        init = false;
        numRun = 0;
        qDebug()<<"mousePressEvent:"<<event->pos().x()<<"|"<<event->pos().y();
    }
 
}
 
void CrabCut_Matting::mouseReleaseEvent(QMouseEvent *event){
    releaseMouse();
    if(event->button()==Qt::LeftButton){//鼠標左鍵
        if (rect.width > 1 && rect.height > 1) {
            setROIMask();
            qDebug()<<"mouseReleaseEvent:"<<rect.width<<"|"<<rect.height;
            //執(zhí)行g(shù)rabcut的代碼
            runGrabCut();
            numRun++;
            showImage();
        }
 
    }
}
/**
 * 將選中的區(qū)域設(shè)置為前景
 * @brief CrabCut_Matting::setROIMask
 */
void CrabCut_Matting::setROIMask(){
    // GC_FGD = 1
    // GC_BGD =0;
    // GC_PR_FGD = 3
    // GC_PR_BGD = 2
    mMask.setTo(GC_BGD);
    rect.x = max(0, rect.x);
    rect.y = max(0, rect.y);
    rect.width = min(rect.width, src.cols - rect.x);
    rect.height = min(rect.height, src.rows - rect.y);
    mMask(rect).setTo(Scalar(GC_PR_FGD));//將選中的區(qū)域設(shè)置為
}
 
void CrabCut_Matting::showImage(){
    Mat result, binMask;
    binMask.create(mMask.size(), CV_8UC1);
    binMask = mMask & 1;
    if (init) {
        src.copyTo(result, binMask);
    } else {
        src.copyTo(result);
    }
    rectangle(result, rect, Scalar(0, 0, 255), 2, 8);
    convert2Sence(result);
 
}
 
 
void CrabCut_Matting::runGrabCut(){
    if (rect.width < 2 || rect.height < 2) {
        return;
    }
 
    if (init) {
        grabCut(src, mMask, rect, bgModel, fgModel, 1);
    } {
        grabCut(src, mMask, rect, bgModel, fgModel, 1, GC_INIT_WITH_RECT);
        init = true;
    }
}
 
 
void CrabCut_Matting::convert2Sence(Mat target){
    scene.clear();
    QImage image = ImageUtils::matToQImage(target);
    QPixmap pixmap = QPixmap::fromImage(image);
    QGraphicsPixmapItem *item = new QGraphicsPixmapItem(pixmap.scaled(this->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation));
    scene.addItem(item);
}

3、示例圖片

以上就是OpenCV使用GrabCut實現(xiàn)摳圖功能的詳細內(nèi)容,更多關(guān)于OpenCV GrabCut摳圖的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • opencv攝像頭捕獲識別顏色

    opencv攝像頭捕獲識別顏色

    這篇文章主要介紹了opencv攝像頭捕獲識別顏色,用opencv通過攝像頭捕獲識別顏色,紅色藍色等,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • 如何將C語言代碼轉(zhuǎn)換為應用程序(也就是編譯)

    如何將C語言代碼轉(zhuǎn)換為應用程序(也就是編譯)

    有時候我們將讓我們的c語言代碼保存為一個exe方便,方便使用,實際就是我們俗說的編譯
    2013-07-07
  • C++程序設(shè)計-五子棋

    C++程序設(shè)計-五子棋

    本文將以簡單的存儲結(jié)構(gòu)及簡單的運算,條件語句,分支語句,循環(huán)語句結(jié)合,帶來一個雙人對戰(zhàn)版五子棋,這是一個簡單的模型,實現(xiàn)了五子棋最最基本的功能。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • C語言如何寫類實現(xiàn)教程示例

    C語言如何寫類實現(xiàn)教程示例

    這篇文章主要為大家介紹了C語言如何寫類的實現(xiàn)教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • C++?結(jié)合?opencv讀取圖片與視頻的方法

    C++?結(jié)合?opencv讀取圖片與視頻的方法

    這篇文章主要介紹了C++?結(jié)合?opencv讀取圖片與視頻,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • C++基于easyx實現(xiàn)迷宮游戲

    C++基于easyx實現(xiàn)迷宮游戲

    這篇文章主要為大家詳細介紹了C++基于easyx實現(xiàn)迷宮游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 詳解C語言中index()函數(shù)和rindex()函數(shù)的用法

    詳解C語言中index()函數(shù)和rindex()函數(shù)的用法

    這篇文章主要介紹了C語言中index()函數(shù)和rndex()函數(shù)的用法,是C語言入門學習中的基礎(chǔ)知識,要的朋友可以參考下
    2015-08-08
  • C++ 匈牙利算法案例分析詳解

    C++ 匈牙利算法案例分析詳解

    這篇文章主要介紹了C++ 匈牙利算法案例分析詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++中的explicit關(guān)鍵字實例淺析

    C++中的explicit關(guān)鍵字實例淺析

    在C++程序中很少有人去使用explicit關(guān)鍵字,不可否認,在平時的實踐中確實很少能用的上,再說C++的功能強大,往往一個問題可以利用好幾種C++特性去解決。接下來給大家介紹 C++中的explicit關(guān)鍵字,需要的朋友可以參考下
    2017-03-03
  • C++?LeetCode542矩陣示例詳解

    C++?LeetCode542矩陣示例詳解

    這篇文章主要為大家介紹了C++?LeetCode542矩陣示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12

最新評論

宣武区| 高碑店市| 苏尼特右旗| 华安县| 尼勒克县| 博罗县| 安庆市| 华池县| 贺兰县| 元谋县| 罗田县| 安岳县| 大石桥市| 花垣县| 舞钢市| 沙雅县| 龙泉市| 宁强县| 额敏县| 徐水县| 孝义市| 乌兰县| 南部县| 长白| 盈江县| 于田县| 湟中县| 汽车| 中阳县| 高平市| 封丘县| 淮阳县| 扶风县| 通州区| 涿鹿县| 奉贤区| 台湾省| 读书| 石屏县| 平罗县| 太保市|