Пример #1
0
void RingBox::update(const cv::Mat &inp)
{
	vector<vector<Point> > contours_ring;
	Mat initial_ring_mask = inp.clone();
	vector<Vec4i> hierarchy_ring;
	vector<Point2f> centre;
	vector<Rect> initial_roi;
	vector<float> radius;

	//imshow("Initial mask", initial_ring_mask);

	findContours(initial_ring_mask, contours_ring, hierarchy_ring, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));
	unsigned int No_of_ring = contours_ring.size();
	vector<bool> markedRing(No_of_ring, true);

	for (int i = 0; i < No_of_ring; ++i)
	{
		if (contours_ring[i].size() < 35)
		{
			markedRing[i] = false;
		}
	}
	unsigned int count = 0;
	for (int i = 0; i < No_of_ring; ++i)
	{
		if (markedRing[i])
		{
			ContourFeature cFeat(contours_ring[i]);
			centre.push_back(cFeat.getCentre()); //centre.y += 10;

			initial_roi.push_back(boundingRect(contours_ring[i])); // This is a OpenCV function
			radius.push_back(sqrt(pow(boundingRect(contours_ring[i]).width, 2.0) + pow(boundingRect(contours_ring[i]).height, 2.0)) / 2);
			++count;
		}
	}
	assert(count == 6);
	int boxSize = centre.size();
	rings.resize(boxSize);
	for (int i = 0; i < boxSize; ++i)
	{
		rings[i] = Ring(centre[i], radius[i], initial_roi[i]);
	}
}
	bool RingBox::init(const cv::Mat &inp, const pegBox &pegBox)
	{
		assert(pegBox.pegs.size() == 12);
		vector<vector<Point> > contours_ring;
		Mat initial_ring_mask = inp.clone();
		vector<Vec4i> hierarchy_ring;
		vector<Rect> initial_roi;


		findContours(initial_ring_mask, contours_ring, hierarchy_ring, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

		for (int i = contours_ring.size() - 1; i >= 0; i--)
		{
			if (contours_ring[i].size() < 50)
			{
				contours_ring.erase(contours_ring.begin() + i);
			}
		}
		unsigned int No_of_ring = contours_ring.size();

		if (No_of_ring == 6)
		{
			vector<vector<Point> > contours_poly(No_of_ring);
			vector<Point2f>center_poly(No_of_ring);
			vector<float>radius_poly(No_of_ring);

			for (int i = 0; i < No_of_ring; ++i)
			{

				ContourFeature cFeat(contours_ring[i]);
				approxPolyDP(Mat(contours_ring[i]), contours_poly[i], 3, true);
				minEnclosingCircle((Mat)contours_poly[i], center_poly[i], radius_poly[i]);
				initial_roi.push_back(boundingRect(contours_ring[i])); 
			}
			
			
			
			const int size_rings = 6;
			rings.resize(size_rings);
			for (int i = 0; i < size_rings; ++i)
			{
				Ring r;
				r.center = center_poly[i];
				r.radius = radius_poly[i];
				r.roi = initial_roi[i];
				r.status = STATIONARY;
				for (int p = 0; p < pegBox.pegs.size(); ++p)
				{
					Rect q = pegBox.pegs[p].roi;
					if ((r.roi & q).width > 0)
					{
						r.code_pos = pegBox.pegs[p].code;
						rings[i] = r;
						break;
					}
				}	
			}
			if (rings.size() == 6)
			{
				return true;
			}
			else
			{
				cout << "There is some problem in overlapping\n";
				return false;
			}
		}
		else
		{
			return false;
		}
	}