diff --git a/modules/features2d/src/descriptors.cpp b/modules/features2d/src/descriptors.cpp index a06fd8fa8b..06efe97913 100644 --- a/modules/features2d/src/descriptors.cpp +++ b/modules/features2d/src/descriptors.cpp @@ -122,57 +122,24 @@ static void convertBGRImageToOpponentColorSpace( const Mat& bgrImage, vector bgrChannels(3); - split( bgrImage, bgrChannels ); - // Prepare opponent color space storage matrices. opponentChannels.resize( 3 ); opponentChannels[0] = cv::Mat(bgrImage.size(), CV_8UC1); // R-G RED-GREEN opponentChannels[1] = cv::Mat(bgrImage.size(), CV_8UC1); // R+G-2B YELLOW-BLUE opponentChannels[2] = cv::Mat(bgrImage.size(), CV_8UC1); // R+G+B - // Calculate the channels of the opponent color space - { - // (R - G)/sqrt(2), but converted to the destination data type - MatConstIterator_ rIt = bgrChannels[2].begin(); - MatConstIterator_ gIt = bgrChannels[1].begin(); - MatIterator_ dstIt = opponentChannels[0].begin(); - for( ; dstIt != opponentChannels[0].end(); ++rIt, ++gIt, ++dstIt ) - { - float value = 0.5f * (static_cast(*gIt) - - static_cast(*rIt) + 255); - (*dstIt) = static_cast(value + 0.5f); - } - } - { - // (R + G - 2B)/sqrt(6), but converted to the destination data type - MatConstIterator_ rIt = bgrChannels[2].begin(); - MatConstIterator_ gIt = bgrChannels[1].begin(); - MatConstIterator_ bIt = bgrChannels[0].begin(); - MatIterator_ dstIt = opponentChannels[1].begin(); - for( ; dstIt != opponentChannels[1].end(); ++rIt, ++gIt, ++bIt, ++dstIt ) + for(int y = 0; y < bgrImage.rows; ++y) + for(int x = 0; x < bgrImage.cols; ++x) { - float value = 0.25f * (static_cast(*rIt) + static_cast(*gIt) - - 2*static_cast(*bIt) + 510); - (*dstIt) = static_cast(value + 0.5f); + Vec3b v = bgrImage.at(y, x); + uchar& b = v[0]; + uchar& g = v[1]; + uchar& r = v[2]; + + opponentChannels[0].at(y, x) = saturate_cast(0.5f * (255 + g - r)); // (R - G)/sqrt(2), but converted to the destination data type + opponentChannels[1].at(y, x) = saturate_cast(0.25f * (510 + r + g - 2*b)); // (R + G - 2B)/sqrt(6), but converted to the destination data type + opponentChannels[2].at(y, x) = saturate_cast(1.f/3.f * (r + g + b)); // (R + G + B)/sqrt(3), but converted to the destination data type } - } - { - // (R + G + B)/sqrt(3), but converted to the destination data type - MatConstIterator_ rIt = bgrChannels[2].begin(); - MatConstIterator_ gIt = bgrChannels[1].begin(); - MatConstIterator_ bIt = bgrChannels[0].begin(); - MatIterator_ dstIt = opponentChannels[2].begin(); - float factor = 1.f/3.f; - for( ; dstIt != opponentChannels[2].end(); ++rIt, ++gIt, ++bIt, ++dstIt ) - { - float value = factor * (static_cast(*rIt) + - static_cast(*gIt) + - static_cast(*bIt)); - (*dstIt) = static_cast(value + 0.5f); - } - } } struct KP_LessThan diff --git a/modules/imgproc/src/imgwarp.cpp b/modules/imgproc/src/imgwarp.cpp index bc5477fd7b..a311d5be67 100644 --- a/modules/imgproc/src/imgwarp.cpp +++ b/modules/imgproc/src/imgwarp.cpp @@ -782,19 +782,8 @@ struct VResizeCubicVec_32f } }; -typedef HResizeNoVec HResizeLinearVec_8u32s; -typedef HResizeNoVec HResizeLinearVec_16u32f; -typedef HResizeNoVec HResizeLinearVec_16s32f; -typedef HResizeNoVec HResizeLinearVec_32f; -typedef HResizeNoVec HResizeLinearVec_64f; - #else -typedef HResizeNoVec HResizeLinearVec_8u32s; -typedef HResizeNoVec HResizeLinearVec_16u32f; -typedef HResizeNoVec HResizeLinearVec_16s32f; -typedef HResizeNoVec HResizeLinearVec_32f; - typedef VResizeNoVec VResizeLinearVec_32s8u; typedef VResizeNoVec VResizeLinearVec_32f16u; typedef VResizeNoVec VResizeLinearVec_32f16s; @@ -807,6 +796,12 @@ typedef VResizeNoVec VResizeCubicVec_32f; #endif +typedef HResizeNoVec HResizeLinearVec_8u32s; +typedef HResizeNoVec HResizeLinearVec_16u32f; +typedef HResizeNoVec HResizeLinearVec_16s32f; +typedef HResizeNoVec HResizeLinearVec_32f; +typedef HResizeNoVec HResizeLinearVec_64f; + template struct HResizeLinear @@ -894,6 +889,34 @@ struct VResizeLinear } }; +template<> +struct VResizeLinear, VResizeLinearVec_32s8u> +{ + typedef uchar value_type; + typedef int buf_type; + typedef short alpha_type; + + void operator()(const buf_type** src, value_type* dst, const alpha_type* beta, int width ) const + { + alpha_type b0 = beta[0], b1 = beta[1]; + const buf_type *S0 = src[0], *S1 = src[1]; + VResizeLinearVec_32s8u vecOp; + + int x = vecOp((const uchar**)src, (uchar*)dst, (const uchar*)beta, width); + #if CV_ENABLE_UNROLLED + for( ; x <= width - 4; x += 4 ) + { + dst[x+0] = uchar(( ((b0 * (S0[x+0] >> 4)) >> 16) + ((b1 * (S1[x+0] >> 4)) >> 16) + 2)>>2); + dst[x+1] = uchar(( ((b0 * (S0[x+1] >> 4)) >> 16) + ((b1 * (S1[x+1] >> 4)) >> 16) + 2)>>2); + dst[x+2] = uchar(( ((b0 * (S0[x+2] >> 4)) >> 16) + ((b1 * (S1[x+2] >> 4)) >> 16) + 2)>>2); + dst[x+3] = uchar(( ((b0 * (S0[x+3] >> 4)) >> 16) + ((b1 * (S1[x+3] >> 4)) >> 16) + 2)>>2); + } + #endif + for( ; x < width; x++ ) + dst[x] = uchar(( ((b0 * (S0[x] >> 4)) >> 16) + ((b1 * (S1[x] >> 4)) >> 16) + 2)>>2); + } +}; + template struct HResizeCubic