From: Marina Kolpakova Date: Thu, 29 Mar 2012 01:16:33 +0000 (+0000) Subject: fixed #1373 X-Git-Tag: accepted/2.0/20130307.220821~940 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f5152500be3e749c638aaad71cecede3ec82a4e8;p=profile%2Fivi%2Fopencv.git fixed #1373 --- diff --git a/modules/imgproc/src/contours.cpp b/modules/imgproc/src/contours.cpp index f8b08fa..507aa42 100644 --- a/modules/imgproc/src/contours.cpp +++ b/modules/imgproc/src/contours.cpp @@ -1984,17 +1984,22 @@ void cv::fitLine( InputArray _points, OutputArray _line, int distType, double param, double reps, double aeps ) { Mat points = _points.getMat(); - bool is3d = points.checkVector(3) >= 0, is2d = is3d ? false : points.checkVector(2) >= 0; - - CV_Assert((is2d || is3d) && (points.depth() == CV_32F || points.depth() == CV_32S)); - CvMat _cpoints = points; + + bool is3d = points.checkVector(3) >= 0; + bool is2d = points.checkVector(2) >= 0; + + CV_Assert( (is2d || is3d) && (points.depth() == CV_32F || points.depth() == CV_32S) ); + CvMat _cpoints = points.reshape(2 + is3d); float line[6]; cvFitLine(&_cpoints, distType, param, reps, aeps, &line[0]); + - _line.create(is2d ? 4 : 6, 1, CV_32F, -1, true); + int out_size = (is2d)?( (is3d)? (points.channels() * points.rows * 2) : 4 ): 6; + + _line.create(out_size, 1, CV_32F, -1, true); Mat l = _line.getMat(); CV_Assert( l.isContinuous() ); - memcpy( l.data, line, (is2d ? 4 : 6)*sizeof(line[0]) ); + memcpy( l.data, line, out_size * sizeof(line[0]) ); } diff --git a/modules/imgproc/test/test_imgwarp.cpp b/modules/imgproc/test/test_imgwarp.cpp index 45713f5..7eab003 100644 --- a/modules/imgproc/test/test_imgwarp.cpp +++ b/modules/imgproc/test/test_imgwarp.cpp @@ -1385,6 +1385,83 @@ TEST(Imgproc_cvWarpAffine, regression) cvWarpAffine(src, dst, &M); } +TEST(Imgproc_fitLine_vector_3d, regression) +{ + std::vector points_vector; + + Point3f p21(4,4,4); + Point3f p22(8,8,8); + + points_vector.push_back(p21); + points_vector.push_back(p22); + + std::vector line; + + cv::fitLine(points_vector, line, CV_DIST_L2, 0 ,0 ,0); + + ASSERT_EQ(line.size(), (size_t)6); + +} + +TEST(Imgproc_fitLine_vector_2d, regression) +{ + std::vector points_vector; + + Point2f p21(4,4); + Point2f p22(8,8); + Point2f p23(16,16); + + points_vector.push_back(p21); + points_vector.push_back(p22); + points_vector.push_back(p23); + + std::vector line; + + cv::fitLine(points_vector, line, CV_DIST_L2, 0 ,0 ,0); + + ASSERT_EQ(line.size(), (size_t)4); +} + +TEST(Imgproc_fitLine_Mat_2dC2, regression) +{ + cv::Mat mat1(3, 1, CV_32SC2); + std::vector line1; + + cv::fitLine(mat1, line1, CV_DIST_L2, 0 ,0 ,0); + + ASSERT_EQ(line1.size(), (size_t)4); +} + +TEST(Imgproc_fitLine_Mat_2dC1, regression) +{ + cv::Matx mat2; + std::vector line2; + + cv::fitLine(mat2, line2, CV_DIST_L2, 0 ,0 ,0); + + ASSERT_EQ(line2.size(), (size_t)4); +} + +TEST(Imgproc_fitLine_Mat_3dC3, regression) +{ + cv::Mat mat1(2, 1, CV_32SC3); + std::vector line1; + + cv::fitLine(mat1, line1, CV_DIST_L2, 0 ,0 ,0); + + ASSERT_EQ(line1.size(), (size_t)6); +} + +TEST(Imgproc_fitLine_Mat_3dC1, regression) +{ + cv::Mat mat2(2, 3, CV_32SC1); + std::vector line2; + + cv::fitLine(mat2, line2, CV_DIST_L2, 0 ,0 ,0); + + ASSERT_EQ(line2.size(), (size_t)6); +} + ////////////////////////////////////////////////////////////////////////// TEST(Imgproc_Resize, accuracy) { CV_ResizeTest test; test.safe_run(); }