• opencv获得轮廓内的所有坐标


    std::vector<std::vector<cv::Point>> fillContour(const std::vector<std::vector<cv::Point>> & _contours)
    {
    	// sort as x descent y descent.
    	std::vector<std::vector<cv::Point>> contours(_contours);
    	for(size_t i = 0; i<contours.size(); ++i)
    	{
    		std::vector<cv::Point> sub(contours[i]);
    		std::sort(sub.begin(), sub.end(), [&](cv::Point & A, cv::Point & B) {
    			if (A.x == B.x)
    				return A.y < B.y;
    			else
    				return A.x < B.x;
    		});
    
    		contours[i] = sub;
    	}
    
    	// restore as pairs with same ys. 
    	std::vector<std::vector<std::pair<cv::Point, cv::Point>>> contours_pair;
    	for (size_t i = 0; i < contours.size(); ++i)
    	{
    		std::vector<std::pair<cv::Point, cv::Point>> pairs;
    
    		for (size_t j = 0; j < contours[i].size(); ++j)
    		{
    			// j==0
    			if (pairs.size() == 0)
    			{
    				pairs.push_back({ contours[i][j],contours[i][j] });
    				continue;
    			}
    
    			// j>0
    			if (contours[i][j].x != pairs[pairs.size() - 1].first.x)
    			{
    				pairs.push_back({ contours[i][j],contours[i][j] });
    				continue;
    			}
    
    			if (contours[i][j].x == pairs[pairs.size() - 1].first.x)
    			{
    				if (contours[i][j].y > pairs[pairs.size() - 1].second.y)
    					pairs[pairs.size() - 1].second = contours[i][j];
    				continue;
    			}
    		}
    
    		contours_pair.push_back(pairs);
    	}
    
    	// fill contour coordinates.
    	std::vector<std::vector< cv::Point>> fill_con;
    	for (auto pair_set : contours_pair)
    	{
    		std::vector<cv::Point> pointSet;
    		for (auto aPair : pair_set)
    		{
    			if (aPair.first == aPair.second)
    			{
    				pointSet.push_back(aPair.first);
    		
    			}
    			else
    			{
    				for (int i = aPair.first.y; i <= aPair.second.y; ++i)
    				{
    					pointSet.push_back(cv::Point(aPair.first.x, i));
    				}
    			}
    
    		}
    		fill_con.push_back(pointSet);
    	}
    
    	return fill_con;
    }
    

      

  • 相关阅读:
    开源软件的国内镜像
    ruby学习之路(一)
    VBS正则表达式
    fscanf和feof的组合使用
    计算机产生随机数
    常用:JQ
    unitegallery 测试使用-自动播放关闭
    H5重力感应(转)
    JS中,如何判断一个数是不是小数?如果是小数,如何判断它是几位小数 保留n位小数
    input禁止显示历史输入记录
  • 原文地址:https://www.cnblogs.com/alexYuin/p/9377322.html
Copyright © 2020-2023  润新知