Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV中的泛洪填充函数_C++_Opencv_Colors_Image Segmentation_Flood Fill - Fatal编程技术网

C++ OpenCV中的泛洪填充函数

C++ OpenCV中的泛洪填充函数,c++,opencv,colors,image-segmentation,flood-fill,C++,Opencv,Colors,Image Segmentation,Flood Fill,浮动范围和固定范围的含义是什么 我使用了floodfill函数来生成如下所示的灰度图像。图像有三个不同强度的区域 外矩形=170 内椭圆=175 内矩形=180 我想将170和175区域作为单个连接组件一起填充,将180区域作为单独的组件填充 我对and函数进行了如下修改: #include <iostream> #include <vector> #include <opencv2/highgui/highgui.hpp> #include <

浮动范围和固定范围的含义是什么

我使用了floodfill函数来生成如下所示的灰度图像。图像有三个不同强度的区域

  • 外矩形=170
  • 内椭圆=175
  • 内矩形=180
  • 我想将170和175区域作为单个连接组件一起填充,将180区域作为单独的组件填充

    我对and函数进行了如下修改:

      #include <iostream>
    #include <vector>
    
    #include <opencv2/highgui/highgui.hpp>
    #include <opencv2/imgproc/imgproc.hpp>
    
    void FindBlobs(const cv::Mat &binary, std::vector < std::vector<cv::Point2i> > &blobs);
    
    int main(int argc, char **argv)
    {
        cv::Mat img = cv::imread("blob.png", 0); // force greyscale
    
        if(!img.data) {
            std::cout << "File not found" << std::endl;
            return -1;
        }
    
        cv::namedWindow("binary");
        cv::namedWindow("labelled");
    
        cv::Mat output = cv::Mat::zeros(img.size(), CV_8UC3);
    
        cv::Mat binary=img.clone();
        std::vector < std::vector<cv::Point2i > > blobs;
            
        FindBlobs(binary, blobs);
    
        // Randomy color the blobs
        for(size_t i=0; i < blobs.size(); i++) {
            unsigned char r = 255 * (rand()/(1.0 + RAND_MAX));
            unsigned char g = 255 * (rand()/(1.0 + RAND_MAX));
            unsigned char b = 255 * (rand()/(1.0 + RAND_MAX));
    
            for(size_t j=0; j < blobs[i].size(); j++) {
                int x = blobs[i][j].x;
                int y = blobs[i][j].y;
    
                output.at<cv::Vec3b>(y,x)[0] = b;
                output.at<cv::Vec3b>(y,x)[1] = g;
                output.at<cv::Vec3b>(y,x)[2] = r;
            }
        }
    
        cv::imshow("binary", img);
        cv::imshow("labelled", output);
        cv::waitKey(0);
    
        return 0;
    }
    
    void FindBlobs(const cv::Mat &binary, std::vector < std::vector<cv::Point2i> > &blobs)
    {
        blobs.clear();
    
        cv::Mat label_image;
        binary.convertTo(label_image, CV_32FC1); 
    
        int label_count = 2; 
    
        for(int y=0; y < binary.rows; y++) {
        {
         for(int x=0; x < binary.cols; x++) {
             {   if((int)label_image.at<float>(y,x) < 150) {  //start labelling only when pixel > 150
                 {
             continue;
                 }
    
                cv::Rect rect;
                cv::floodFill(label_image, cv::Point(x,y), cv::Scalar(label_count), &rect, cv::Scalar(0), cv::Scalar(6), 4+CV_FLOODFILL_FIXED_RANGE);
    
                std::vector <cv::Point2i> blob;
    
                for(int i=rect.y; i < (rect.y+rect.height); i++) {
                {   for(int j=rect.x; j < (rect.x+rect.width); j++) {
                    {   if((int)label_image.at<float>(i,j) != label_count) {
                        {    continue;
                        }
    
                        blob.push_back(cv::Point2i(j,i));
                    }
                }
    
                blobs.push_back(blob);
    
                label_count++;
            }
        }
    }
    
    #包括
    #包括
    #包括
    #包括
    void FindBlobs(常量cv::Mat和binary,std::vector&blobs);
    int main(int argc,字符**argv)
    {
    cv::Mat img=cv::imread(“blob.png”,0);//强制灰度
    如果(!img.data){
    标准::cout和blobs)
    {
    blobs.clear();
    cv::Mat标签_图像;
    二进制.convertTo(label_image,CV_32FC1);
    int label_count=2;
    对于(int y=0;y150时才开始标记
    {
    继续;
    }
    cv::Rect Rect;
    cv::泛光填充(标签图像,cv::点(x,y),cv::标量(标签计数),&rect,cv::标量(0),cv::标量(6),4+cv\U泛光填充固定范围);
    std::向量blob;
    对于(int i=rect.y;i<(rect.y+rect.height);i++){
    {for(int j=rect.x;j<(rect.x+rect.width);j++){
    {if((int)label_image.at(i,j)!=label_count){
    {继续;
    }
    blob.push_back(cv::Point2i(j,i));
    }
    }
    水滴。推回(水滴);
    标签_计数++;
    }
    }
    }
    
    我使用标志CV\u FLOODFILL\u fixed\u range使用了fixed range(我使用的方法正确吗??

    我指定loDiff=0和upDiff=6

    I预计当种子变为170时,170-0到170+6范围内的所有点(即170到176外矩形和内椭圆)都用相同的标签填充,因为内矩形是180,所以它会有不同的标签

    但是,我得到的输出如下:-

    外矩形和内椭圆没有相同的标签。可能是什么错误


    预期o/p:内部椭圆也为橙色(与外部矩形相同)

    您是否尝试仅应用整体填充,即放弃此
    FindBlobs
    等,在点
    (0,0)上应用
    整体填充
    并使用与您相同的参数将泛光区域替换为灰度强度,这是结果图像:(排除问题中所示图像中引入的伪影,这是您想要的结果).我不希望这只适用于此图像…我需要将特定范围内公差为0到+5的区域,即170-175(如果170成为种子值)标记为单个组件…我必须使用FindBlobs,因为我检查条件标签。\u图像。在(y,x)<150,这意味着我只在像素大于150时才开始标记…如果我从(0,0)开始,它将在这种情况下工作,因为我知道(0,0)是170,大于150。一直以来都存在误解。如果所有代码都正常工作,那么它也将在(0,0)进行泛洪填充。这意味着您应该得到与链接图像类似的输出。由于它不提供相同的输出,因此问题与整体填充无关。因此,问题是没有意义的。目的是标记代码在迭代时完成的所有区域,以检查未标记的区域……我想问,为什么我的代码不提供作为输出的输出你的链接…虽然我已经正确地将参数传递给了floodFill函数…它应该在你的链接中标记外矩形和椭圆,在我的链接中标记内矩形…但我不明白为什么它在标记外矩形和椭圆时有所不同?你使用CV_floodFill_FIXED_RANGE是因为这个qn的动机是了解浮动和固定范围的含义…如果我使用浮动范围,我会得到预期的o/p…而不是CV_FLOODFILL_fixed_range(我在代码中使用过)