Commit 7d19bd6c authored by Vadim Pisarevsky's avatar Vadim Pisarevsky Committed by Alexander Alekhin

Merge pull request #11634 from vpisarev:empty_mat_with_types_2

fixes handling of empty matrices in some functions (#11634)

* a part of PR #11416 by Yuki Takehara

* moved the empty mat check in Mat::copyTo()

* fixed some test failures
parent da75e463
...@@ -556,7 +556,7 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca ...@@ -556,7 +556,7 @@ int CV_StereoMatchingTest::processStereoMatchingResults( FileStorage& fs, int ca
assert( fs.isOpened() ); assert( fs.isOpened() );
assert( trueLeftDisp.type() == CV_32FC1 ); assert( trueLeftDisp.type() == CV_32FC1 );
assert( trueRightDisp.empty() || trueRightDisp.type() == CV_32FC1 ); assert( trueRightDisp.empty() || trueRightDisp.type() == CV_32FC1 );
assert( leftDisp.type() == CV_32FC1 && rightDisp.type() == CV_32FC1 ); assert( leftDisp.type() == CV_32FC1 && (rightDisp.empty() || rightDisp.type() == CV_32FC1) );
// get masks for unknown ground truth disparity values // get masks for unknown ground truth disparity values
Mat leftUnknMask, rightUnknMask; Mat leftUnknMask, rightUnknMask;
......
...@@ -1673,7 +1673,7 @@ Mat_<_Tp>& Mat_<_Tp>::operator = (const Mat& m) ...@@ -1673,7 +1673,7 @@ Mat_<_Tp>& Mat_<_Tp>::operator = (const Mat& m)
{ {
return (*this = m.reshape(DataType<_Tp>::channels, m.dims, 0)); return (*this = m.reshape(DataType<_Tp>::channels, m.dims, 0));
} }
CV_DbgAssert(DataType<_Tp>::channels == m.channels()); CV_Assert(DataType<_Tp>::channels == m.channels() || m.empty());
m.convertTo(*this, type()); m.convertTo(*this, type());
return *this; return *this;
} }
......
...@@ -1233,6 +1233,12 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op) ...@@ -1233,6 +1233,12 @@ void cv::compare(InputArray _src1, InputArray _src2, OutputArray _dst, int op)
CV_Assert( op == CMP_LT || op == CMP_LE || op == CMP_EQ || CV_Assert( op == CMP_LT || op == CMP_LE || op == CMP_EQ ||
op == CMP_NE || op == CMP_GE || op == CMP_GT ); op == CMP_NE || op == CMP_GE || op == CMP_GT );
if(_src1.empty() && _src2.empty())
{
_dst.release();
return;
}
bool haveScalar = false; bool haveScalar = false;
if ((_src1.isMatx() + _src2.isMatx()) == 1 if ((_src1.isMatx() + _src2.isMatx()) == 1
......
...@@ -1304,6 +1304,12 @@ void cv::Mat::convertTo(OutputArray _dst, int _type, double alpha, double beta) ...@@ -1304,6 +1304,12 @@ void cv::Mat::convertTo(OutputArray _dst, int _type, double alpha, double beta)
{ {
CV_INSTRUMENT_REGION() CV_INSTRUMENT_REGION()
if( empty() )
{
_dst.release();
return;
}
bool noScale = fabs(alpha-1) < DBL_EPSILON && fabs(beta) < DBL_EPSILON; bool noScale = fabs(alpha-1) < DBL_EPSILON && fabs(beta) < DBL_EPSILON;
if( _type < 0 ) if( _type < 0 )
......
...@@ -246,13 +246,14 @@ void Mat::copyTo( OutputArray _dst ) const ...@@ -246,13 +246,14 @@ void Mat::copyTo( OutputArray _dst ) const
return; return;
} }
if( empty() )
{
_dst.release();
return;
}
if( _dst.isUMat() ) if( _dst.isUMat() )
{ {
if( empty() )
{
_dst.release();
return;
}
_dst.create( dims, size.p, type() ); _dst.create( dims, size.p, type() );
UMat dst = _dst.getUMat(); UMat dst = _dst.getUMat();
CV_Assert(dst.u != NULL); CV_Assert(dst.u != NULL);
......
...@@ -7952,6 +7952,12 @@ public: ...@@ -7952,6 +7952,12 @@ public:
{ {
CV_INSTRUMENT_REGION() CV_INSTRUMENT_REGION()
if(_image.empty())
{
keypoints.clear();
return;
}
Mat mask = _mask.getMat(), grayImage; Mat mask = _mask.getMat(), grayImage;
UMat ugrayImage; UMat ugrayImage;
_InputArray gray = _image; _InputArray gray = _image;
......
...@@ -526,6 +526,12 @@ public: ...@@ -526,6 +526,12 @@ public:
{ {
CV_INSTRUMENT_REGION() CV_INSTRUMENT_REGION()
if(_image.empty())
{
keypoints.clear();
return;
}
Mat mask = _mask.getMat(), grayImage; Mat mask = _mask.getMat(), grayImage;
UMat ugrayImage; UMat ugrayImage;
_InputArray gray = _image; _InputArray gray = _image;
......
...@@ -80,6 +80,12 @@ public: ...@@ -80,6 +80,12 @@ public:
{ {
CV_INSTRUMENT_REGION() CV_INSTRUMENT_REGION()
if(_image.empty())
{
keypoints.clear();
return;
}
std::vector<Point2f> corners; std::vector<Point2f> corners;
if (_image.isUMat()) if (_image.isUMat())
......
...@@ -803,7 +803,7 @@ static bool ocl_HoughLines(InputArray _src, OutputArray _lines, double rho, doub ...@@ -803,7 +803,7 @@ static bool ocl_HoughLines(InputArray _src, OutputArray _lines, double rho, doub
int total_points = counters.getMat(ACCESS_READ).at<int>(0, 0); int total_points = counters.getMat(ACCESS_READ).at<int>(0, 0);
if (total_points <= 0) if (total_points <= 0)
{ {
_lines.assign(UMat(0,0,CV_32FC2)); _lines.release();
return true; return true;
} }
...@@ -831,7 +831,7 @@ static bool ocl_HoughLines(InputArray _src, OutputArray _lines, double rho, doub ...@@ -831,7 +831,7 @@ static bool ocl_HoughLines(InputArray _src, OutputArray _lines, double rho, doub
if (total_lines > 0) if (total_lines > 0)
_lines.assign(lines.rowRange(Range(0, total_lines))); _lines.assign(lines.rowRange(Range(0, total_lines)));
else else
_lines.assign(UMat(0,0,CV_32FC2)); _lines.release();
return true; return true;
} }
...@@ -857,7 +857,7 @@ static bool ocl_HoughLinesP(InputArray _src, OutputArray _lines, double rho, dou ...@@ -857,7 +857,7 @@ static bool ocl_HoughLinesP(InputArray _src, OutputArray _lines, double rho, dou
int total_points = counters.getMat(ACCESS_READ).at<int>(0, 0); int total_points = counters.getMat(ACCESS_READ).at<int>(0, 0);
if (total_points <= 0) if (total_points <= 0)
{ {
_lines.assign(UMat(0,0,CV_32SC4)); _lines.release();
return true; return true;
} }
...@@ -885,7 +885,7 @@ static bool ocl_HoughLinesP(InputArray _src, OutputArray _lines, double rho, dou ...@@ -885,7 +885,7 @@ static bool ocl_HoughLinesP(InputArray _src, OutputArray _lines, double rho, dou
if (total_lines > 0) if (total_lines > 0)
_lines.assign(lines.rowRange(Range(0, total_lines))); _lines.assign(lines.rowRange(Range(0, total_lines)));
else else
_lines.assign(UMat(0,0,CV_32SC4)); _lines.release();
return true; return true;
} }
......
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