Fixed asserts in fillPoly.

This commit is contained in:
Alexander Smorkalov 2024-08-06 10:40:45 +03:00
parent 333054e05e
commit 9dee2c6e67
2 changed files with 27 additions and 3 deletions

View File

@ -0,0 +1,21 @@
#!/usr/bin/env python
from __future__ import print_function
import numpy as np
import cv2 as cv
from tests_common import NewOpenCVTests
class Imgproc_Tests(NewOpenCVTests):
def test_python_986(self):
cntls = []
img = np.zeros((100,100,3), dtype=np.uint8)
color = (0,0,0)
cnts = np.array(cntls, dtype=np.int32).reshape((1, -1, 2))
try:
cv.fillPoly(img, cnts, color)
assert False
except:
assert True

View File

@ -2044,8 +2044,11 @@ void fillPoly( InputOutputArray _img, const Point** pts, const int* npts, int nc
edges.reserve( total + 1 ); edges.reserve( total + 1 );
for (i = 0; i < ncontours; i++) for (i = 0; i < ncontours; i++)
{ {
std::vector<Point2l> _pts(pts[i], pts[i] + npts[i]); if (npts[i] > 0 && pts[i])
CollectPolyEdges(img, _pts.data(), npts[i], edges, buf, line_type, shift, offset); {
std::vector<Point2l> _pts(pts[i], pts[i] + npts[i]);
CollectPolyEdges(img, _pts.data(), npts[i], edges, buf, line_type, shift, offset);
}
} }
FillEdgeCollection(img, edges, buf, line_type); FillEdgeCollection(img, edges, buf, line_type);
@ -2430,7 +2433,7 @@ void cv::fillPoly(InputOutputArray img, InputArrayOfArrays pts,
for( i = 0; i < ncontours; i++ ) for( i = 0; i < ncontours; i++ )
{ {
Mat p = pts.getMat(manyContours ? i : -1); Mat p = pts.getMat(manyContours ? i : -1);
CV_Assert(p.checkVector(2, CV_32S) >= 0); CV_Assert(p.checkVector(2, CV_32S) > 0);
ptsptr[i] = p.ptr<Point>(); ptsptr[i] = p.ptr<Point>();
npts[i] = p.rows*p.cols*p.channels()/2; npts[i] = p.rows*p.cols*p.channels()/2;
} }