| 1 | initial version |
This is how to "decipher" your OpenCV assert error:
double cv::pointPolygonTest (InputArray contour, Point2f pt, bool measureDist)retval = cv.pointPolygonTest(contour, pt, measureDist) but since Python OpenCV interface is wrapped from C++, it is important to understand the C++ APIInputArray is just a proxy class, the most common OpenCV class is cv::Mat to hold image data or matrix information(depth == CV_32S || depth == CV_32F) means that the expected depth of the input data should be CV_32S (32-bit integer) or CV_32F (32-bit floating point)Here the mapping:
CV_8U <--> 8-bit unsigned integers (unsigned char in C++)CV_8S <--> 8-bit signed integers (char in C++)CV_16U <--> 16-bit unsigned integers (unsigned short in C++)CV_16S <--> 16-bit signed integers (short in C++)CV_32S <--> 32-bit signed integesr (int in C++)CV_32F <--> 32-bit floating-point numbers (float in C++)CV_64F <--> 64-bit floating-point numbers (double in C++)For cv::Mat, the important things to remember for cv::Mat m; are:
m.depth(), see the documentation:Returns the depth of a matrix element.
The method returns the identifier of the matrix element depth (the type of each individual channel). For example, for a 16-bit signed element array, the method returns CV_16S . A complete list of matrix types contains the following values:
CV_8U - 8-bit unsigned integers ( 0..255 ) CV_8S - 8-bit signed integers ( -128..127 ) CV_16U - 16-bit unsigned integers ( 0..65535 ) CV_16S - 16-bit signed integers ( -32768..32767 ) CV_32S - 32-bit signed integers ( -2147483648..2147483647 ) CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN) CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN )
m.channels(), e.g. 3 for a color imagem.type(), that is the combination depth with channels, e.g. CV_8UC3 for a color imageThis condition total >= 0 should mean that the number of points in the contour matrix must be >= 0. This looks a little bit odd since we could expect to check for a strictly positive number but this is just like it is written currently in the code:
double cv::pointPolygonTest( InputArray _contour, Point2f pt, bool measureDist )
{
CV_INSTRUMENT_REGION();
double result = 0;
Mat contour = _contour.getMat();
int i, total = contour.checkVector(2), counter = 0;
int depth = contour.depth();
CV_Assert( total >= 0 && (depth == CV_32S || depth == CV_32F));
bool is_float = depth == CV_32F;
double min_dist_num = FLT_MAX, min_dist_denom = 1;
Point ip(cvRound(pt.x), cvRound(pt.y));
if( total == 0 )
return measureDist ? -DBL_MAX : -1;
Also, don't be afraid to look directly into the source code.
| 2 | No.2 Revision |
This is how to "decipher" your OpenCV assert error:
double cv::pointPolygonTest (InputArray contour, Point2f pt, bool measureDist)retval = cv.pointPolygonTest(contour, pt, measureDist) but since Python OpenCV interface is wrapped from C++, it is important to understand the C++ APIInputArray is just a proxy class, the most common OpenCV class is cv::Mat to hold image data or matrix information(depth == CV_32S || depth == CV_32F) means that the expected depth of the input data should be CV_32S (32-bit integer) or CV_32F (32-bit floating point)Here the mapping:
CV_8U <--> 8-bit unsigned integers (unsigned char in uchar in OpenCV)CV_8S <--> 8-bit signed integers (char in schar in OpenCV)CV_16U <--> 16-bit unsigned integers (unsigned short in ushort in OpenCV)CV_16S <--> 16-bit signed integers (short in C++)CV_32S <--> 32-bit signed integesr (int in C++)CV_32F <--> 32-bit floating-point numbers (float in C++)CV_64F <--> 64-bit floating-point numbers (double in C++)The list of primitive types in OpenCV:
//! - schar - signed 1 byte integer
//! - uchar - unsigned 1 byte integer
//! - short - signed 2 byte integer
//! - ushort - unsigned 2 byte integer
//! - int - signed 4 byte integer
//! - uint - unsigned 4 byte integer
//! - int64 - signed 8 byte integer
//! - uint64 - unsigned 8 byte integer
For cv::Mat, the important things to remember for cv::Mat m; are:
m.depth(), see the documentation:Returns the depth of a matrix element.
The method returns the identifier of the matrix element depth (the type of each individual channel). For example, for a 16-bit signed element array, the method returns CV_16S . A complete list of matrix types contains the following values:
CV_8U - 8-bit unsigned integers ( 0..255 ) CV_8S - 8-bit signed integers ( -128..127 ) CV_16U - 16-bit unsigned integers ( 0..65535 ) CV_16S - 16-bit signed integers ( -32768..32767 ) CV_32S - 32-bit signed integers ( -2147483648..2147483647 ) CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF,NANNAN )
NAN )CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF,NAN )
m.channels(), e.g. 3 for a color imagem.type(), that is the combination depth with channels, e.g. CV_8UC3 for a color imageThis condition total >= 0 should mean that the number of points in the contour matrix must be >= 0. This looks a little bit odd since we could expect to check for a strictly positive number but this is just like it is written currently in the code:
double cv::pointPolygonTest( InputArray _contour, Point2f pt, bool measureDist )
{
CV_INSTRUMENT_REGION();
double result = 0;
Mat contour = _contour.getMat();
int i, total = contour.checkVector(2), counter = 0;
int depth = contour.depth();
CV_Assert( total >= 0 && (depth == CV_32S || depth == CV_32F));
bool is_float = depth == CV_32F;
double min_dist_num = FLT_MAX, min_dist_denom = 1;
Point ip(cvRound(pt.x), cvRound(pt.y));
if( total == 0 )
return measureDist ? -DBL_MAX : -1;
Also, don't be afraid to look directly into the source code.