cv::completeSymm fixed to work with any OpenCV data type and multiple channels.

parent 10849d1c
...@@ -2032,39 +2032,24 @@ void cv::transpose( InputArray _src, OutputArray _dst ) ...@@ -2032,39 +2032,24 @@ void cv::transpose( InputArray _src, OutputArray _dst )
} }
////////////////////////////////////// completeSymm /////////////////////////////////////////
void cv::completeSymm( InputOutputArray _m, bool LtoR ) void cv::completeSymm( InputOutputArray _m, bool LtoR )
{ {
Mat m = _m.getMat(); Mat m = _m.getMat();
CV_Assert( m.dims <= 2 ); size_t step = m.step, esz = m.elemSize();
CV_Assert( m.dims <= 2 && m.rows == m.cols );
int i, j, nrows = m.rows, type = m.type(); int rows = m.rows;
int j0 = 0, j1 = nrows; int j0 = 0, j1 = rows;
CV_Assert( m.rows == m.cols );
if( type == CV_32FC1 || type == CV_32SC1 ) uchar* data = m.data;
for( int i = 0; i < rows; i++ )
{ {
int* data = (int*)m.data; if( !LtoR ) j1 = i; else j0 = i+1;
size_t step = m.step/sizeof(data[0]); for( int j = j0; j < j1; j++ )
for( i = 0; i < nrows; i++ ) memcpy(data + (i*step + j*esz), data + (j*step + i*esz), esz);
{
if( !LtoR ) j1 = i; else j0 = i+1;
for( j = j0; j < j1; j++ )
data[i*step + j] = data[j*step + i];
}
} }
else if( type == CV_64FC1 )
{
double* data = (double*)m.data;
size_t step = m.step/sizeof(data[0]);
for( i = 0; i < nrows; i++ )
{
if( !LtoR ) j1 = i; else j0 = i+1;
for( j = j0; j < j1; j++ )
data[i*step + j] = data[j*step + i];
}
}
else
CV_Error( CV_StsUnsupportedFormat, "" );
} }
......
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