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;
}

  

posted @ 2018-07-27 14:15  路边的十元钱硬币  阅读(3425)  评论(0编辑  收藏  举报