1. 程式人生 > 其它 >opencv-floodfill漫水填充

opencv-floodfill漫水填充

函式作用:

  用給定的顏色填充一個連通區域

例項:

3.jpg

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

int main(int argc, char** argv) {

    
    cv::Mat src = cv::imread("D:/bb/tu/3.jpg");
    cv::Mat src1 = src.clone();
    
    imshow("原始圖", src);
    cv::Rect ccomp;
    floodFill(src, cv::Point(50, 100), cv::Scalar(255
, 0, 0), &ccomp, cv::Scalar(10, 10, 10), cv::Scalar(10, 10, 10));//漫水填充--不帶掩膜版本 /* 第一個引數:InputOutputArray型別的image, 輸入/輸出1通道或3通道,8位或浮點影象,具體引數由之後的引數具體指明 第二個引數:Point型別,漫水填充演算法的起始點 第三個引數:Scalar型別,畫素點被染色的值,即在重繪區域畫素的新值 第四個引數:Rect*型別-可選輸出引數,有預設值0,一個可選的引數,用於設定floodFill函式將要重繪區域的最小邊界矩形區域 第五個引數:當前選定畫素與其連通區中相鄰畫素中的一個畫素,或者與加入該連通區的一個seedPoint畫素,二者之間的最大下行差異值,有預設值Scalar( ) 【與引數2點 畫素顏色的差異下行值】 第六個引數:當前選定畫素與其連通區中相鄰畫素中的一個畫素,或者與加入該連通區的一個seedPoint畫素,二者之間的最大上行差異值,有預設值Scalar( ) 【與引數2點 畫素顏色的差異上行值】 第七個引數:flags操作標誌符 (1)低八位(第0~7位),用於控制演算法的連通性,可取4(預設值)或者8。如果設為4,表示填充演算法只考慮當前畫素水平 方向和垂直方向的相鄰點。如果設為8,除上述相鄰點外,還會包含對角線方向的相鄰點。 (2)高八位部分(16~23位),可以為0或者如下兩種選項識別符號的組合 FLOODFILL_FIXED_RANGE - 如果設定為這個識別符號的話,就會考慮當前畫素與種子畫素之間的差,否則就考慮當前畫素與其相 鄰畫素的差。也就是說,這個範圍是浮動的。 FLOODFILL_MASK_ONLY - 如果設定為這個識別符號的話,函式不會去填充改變原始影象 (也就是忽略第三個引數newVal), 而是 只使用flags標誌中bit8-15的值去填充掩模影象(mask)。這個識別符號只對第二個版本的floodFill有用,因第一個版本里面 壓根就沒有mask引數。 (3)中間八位部分,上面關於高八位FLOODFILL_MASK_ONLY識別符號中已經說的很明顯,需要輸入符合要求的掩碼。 Floodfill的flags引數的中間八位的值就是用於指定填充掩碼影象的值的。但如果flags中間八位的值為0,則掩碼會用1來填充
*/ imshow("不帶掩膜", src); cv::Mat mask(src.rows + 2, src.cols + 2, CV_8UC1, cv::Scalar(0)); //掩膜 for (int row = 0; row < 50;row++) { for (int col = 0; col < 100;col++) { mask.at<uchar>(row, col) = 100; } } floodFill(src1,mask, cv::Point(50, 100), cv::Scalar(255
, 0, 0), &ccomp, cv::Scalar(10, 10, 10), cv::Scalar(10, 10, 10));//漫水填充--帶掩膜版本 /*第二個引數,mask表示操作掩膜,為單通道8位,長寬都比輸入影象大兩個畫素點的影象。 漫水填充不會填充掩膜mask的非零畫素區域,mask中與輸入影象(x,y)畫素點相對應的點的座標為(x+1,y+1) */ imshow("帶掩膜", src1); cv::waitKey(0); return 0; }