亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenCV如何使用GrabCut實現摳圖功能

發布時間:2023-02-20 09:08:00 來源:億速云 閱讀:111 作者:iii 欄目:開發技術

這篇文章主要介紹“OpenCV如何使用GrabCut實現摳圖功能”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“OpenCV如何使用GrabCut實現摳圖功能”文章能幫助大家解決問題。

1、概述

案例:使用OpenCV的GrapCut實現有用戶交互的摳圖

grabCut( InputArray img, InputOutputArray mask, Rect rect,
                           InputOutputArray bgdModel, InputOutputArray fgdModel,
                           int iterCount, int mode = GC_EVAL );
  • img --> 輸入的三通道圖像;

  • mask --> 輸入的單通道圖像,初始化方式為GC_INIT_WITH_RECT表示ROI區域可以被初始化為:

  • GC_BGD --> 定義為明顯的背景像素 0

  • GC_FGD --> 定義為明顯的前景像素 1

  • GC_PR_BGD --> 定義為可能的背景像素 2

  • GC_PR_FGD --> 定義為可能的前景像素 3

  • rect --> 表示roi區域;

  • bgdModel --> 表示臨時背景模型數組;

  • fgdModel --> 表示臨時前景模型數組;

  • iterCount --> 表示圖割算法迭代次數, 次數越多,效果越好;

  • mode --> 當使用用戶提供的roi時候使用GC_INIT_WITH_RECT

實現算法的步驟:

1.創建一個遮罩,并初始化為背景GC_BGD

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

3.調用grabCut函數實現算法

4.輸入mask即為目標摳圖

2、代碼示例

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

CrabCut_Matting::CrabCut_Matting(QWidget *parent)
    : MyGraphicsView{parent}
{
    this->setWindowTitle("crabCut摳圖");
    this->setMouseTracking(true);//設置鼠標事件可用
    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;
    }
 
    //創建一個背景遮罩
    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;
            //執行grabcut的代碼
            runGrabCut();
            numRun++;
            showImage();
        }
 
    }
}
/**
 * 將選中的區域設置為前景
 * @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));//將選中的區域設置為
}
 
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);
}

關于“OpenCV如何使用GrabCut實現摳圖功能”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

乐昌市| 建始县| 黄平县| 定安县| 古丈县| 曲周县| 双鸭山市| 新乡市| 内黄县| 厦门市| 阿拉善右旗| 武邑县| 砚山县| 土默特左旗| 运城市| 慈利县| 长寿区| 北辰区| 铅山县| 广元市| 华蓥市| 喜德县| 丽江市| 德令哈市| 新和县| 福泉市| 汝城县| 宁明县| 株洲市| 陈巴尔虎旗| 怀安县| 富平县| 芒康县| 定南县| 阿合奇县| 武宣县| 海安县| 千阳县| 高要市| 资讯| 甘德县|