Commit 34df4ae0 authored by Vladislav Sovrasov's avatar Vladislav Sovrasov

Add a regression test, fix documentation

parent 1f4f50b9
...@@ -3732,21 +3732,17 @@ CV_EXPORTS_W int connectedComponentsWithStats(InputArray image, OutputArray labe ...@@ -3732,21 +3732,17 @@ CV_EXPORTS_W int connectedComponentsWithStats(InputArray image, OutputArray labe
/** @brief Finds contours in a binary image. /** @brief Finds contours in a binary image.
The function retrieves contours from the binary image using the algorithm @cite Suzuki85 . The contours The function retrieves contours from the binary image using the algorithm @cite Suzuki85 . The contours
are a useful tool for shape analysis and object detection and recognition. See squares.c in the are a useful tool for shape analysis and object detection and recognition. See squares.cpp in the
OpenCV sample directory. OpenCV sample directory.
@note Source image is modified by this function. Also, the function does not take into account
1-pixel border of the image (it's filled with 0's and used for neighbor analysis in the algorithm),
therefore the contours touching the image border will be clipped.
@param image Source, an 8-bit single-channel image. Non-zero pixels are treated as 1's. Zero @param image Source, an 8-bit single-channel image. Non-zero pixels are treated as 1's. Zero
pixels remain 0's, so the image is treated as binary . You can use compare , inRange , threshold , pixels remain 0's, so the image is treated as binary . You can use cv::compare, cv::inRange, cv::threshold ,
adaptiveThreshold , Canny , and others to create a binary image out of a grayscale or color one. cv::adaptiveThreshold, cv::Canny, and others to create a binary image out of a grayscale or color one.
The function modifies the image while extracting the contours. If mode equals to RETR_CCOMP If mode equals to cv::RETR_CCOMP or cv::RETR_FLOODFILL, the input can also be a 32-bit integer image of labels (CV_32SC1).
or RETR_FLOODFILL, the input can also be a 32-bit integer image of labels (CV_32SC1). @param contours Detected contours. Each contour is stored as a vector of points (e.g.
@param contours Detected contours. Each contour is stored as a vector of points. std::vector<std::vector<cv::Point> >).
@param hierarchy Optional output vector, containing information about the image topology. It has @param hierarchy Optional output vector (e.g. std::vector<cv::Vec4i>), containing information about the image topology. It has
as many elements as the number of contours. For each i-th contour contours[i] , the elements as many elements as the number of contours. For each i-th contour contours[i], the elements
hierarchy[i][0] , hiearchy[i][1] , hiearchy[i][2] , and hiearchy[i][3] are set to 0-based indices hierarchy[i][0] , hiearchy[i][1] , hiearchy[i][2] , and hiearchy[i][3] are set to 0-based indices
in contours of the next and previous contours at the same hierarchical level, the first child in contours of the next and previous contours at the same hierarchical level, the first child
contour and the parent contour, respectively. If for the contour i there are no next, previous, contour and the parent contour, respectively. If for the contour i there are no next, previous,
......
...@@ -483,10 +483,26 @@ TEST(Imgproc_FindContours, hilbert) ...@@ -483,10 +483,26 @@ TEST(Imgproc_FindContours, hilbert)
img.setTo(Scalar::all(0)); img.setTo(Scalar::all(0));
drawContours(img, contours, 0, Scalar::all(255), 1); drawContours(img, contours, 0, Scalar::all(255), 1);
//imshow("hilbert", img);
//waitKey();
ASSERT_EQ(1, (int)contours.size()); ASSERT_EQ(1, (int)contours.size());
ASSERT_EQ(9832, (int)contours[0].size()); ASSERT_EQ(9832, (int)contours[0].size());
} }
TEST(Imgproc_FindContours, border)
{
Mat img;
copyMakeBorder(Mat::zeros(8, 10, CV_8U), img, 1, 1, 1, 1, BORDER_CONSTANT, Scalar(1));
std::vector<std::vector<cv::Point> > contours;
findContours(img, contours, RETR_LIST, CHAIN_APPROX_NONE);
Mat img_draw_contours = Mat::zeros(img.size(), CV_8U);
for (size_t cpt = 0; cpt < contours.size(); cpt++)
{
drawContours(img_draw_contours, contours, static_cast<int>(cpt), cv::Scalar(255));
}
ASSERT_TRUE(norm(img - img_draw_contours, NORM_INF) == 0.0);
}
/* End of file. */ /* End of file. */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment