| 1141 | |
| 1142 | #if defined (HAVE_IPP) && (IPP_VERSION_MAJOR >= 7) |
| 1143 | static bool IPPMorphReplicate(int op, const Mat &src, Mat &dst, const Mat &kernel, |
| 1144 | const Size& ksize, const Point &anchor, bool rectKernel) |
| 1145 | { |
| 1146 | int type = src.type(); |
| 1147 | const Mat* _src = &src; |
| 1148 | Mat temp; |
| 1149 | if( src.data == dst.data ) |
| 1150 | { |
| 1151 | src.copyTo(temp); |
| 1152 | _src = &temp; |
| 1153 | } |
| 1154 | //DEPRECATED. Allocates and initializes morphology state structure for erosion or dilation operation. |
| 1155 | typedef IppStatus (CV_STDCALL* ippiMorphologyInitAllocFunc)(int, const void*, IppiSize, IppiPoint, IppiMorphState **); |
| 1156 | typedef IppStatus (CV_STDCALL* ippiMorphologyBorderReplicateFunc)(const void*, int, void *, int, |
| 1157 | IppiSize, IppiBorderType, IppiMorphState *); |
| 1158 | typedef IppStatus (CV_STDCALL* ippiFilterMinMaxGetBufferSizeFunc)(int, IppiSize, int*); |
| 1159 | typedef IppStatus (CV_STDCALL* ippiFilterMinMaxBorderReplicateFunc)(const void*, int, void*, int, |
| 1160 | IppiSize, IppiSize, IppiPoint, void*); |
| 1161 | |
| 1162 | ippiMorphologyInitAllocFunc initAllocFunc = 0; |
| 1163 | ippiMorphologyBorderReplicateFunc morphFunc = 0; |
| 1164 | ippiFilterMinMaxGetBufferSizeFunc getBufSizeFunc = 0; |
| 1165 | ippiFilterMinMaxBorderReplicateFunc morphRectFunc = 0; |
| 1166 | |
| 1167 | #define IPP_MORPH_CASE(type, flavor) \ |
| 1168 | case type: \ |
| 1169 | initAllocFunc = (ippiMorphologyInitAllocFunc)ippiMorphologyInitAlloc_##flavor; \ |
| 1170 | morphFunc = op == MORPH_ERODE ? (ippiMorphologyBorderReplicateFunc)ippiErodeBorderReplicate_##flavor : \ |
| 1171 | (ippiMorphologyBorderReplicateFunc)ippiDilateBorderReplicate_##flavor; \ |
| 1172 | getBufSizeFunc = (ippiFilterMinMaxGetBufferSizeFunc)ippiFilterMinGetBufferSize_##flavor; \ |
| 1173 | morphRectFunc = op == MORPH_ERODE ? (ippiFilterMinMaxBorderReplicateFunc)ippiFilterMinBorderReplicate_##flavor : \ |
| 1174 | (ippiFilterMinMaxBorderReplicateFunc)ippiFilterMaxBorderReplicate_##flavor; \ |
| 1175 | break |
| 1176 | |
| 1177 | switch( type ) |
| 1178 | { |
| 1179 | IPP_MORPH_CASE(CV_8UC1, 8u_C1R); |
| 1180 | IPP_MORPH_CASE(CV_8UC3, 8u_C3R); |
| 1181 | IPP_MORPH_CASE(CV_8UC4, 8u_C4R); |
| 1182 | IPP_MORPH_CASE(CV_32FC1, 32f_C1R); |
| 1183 | IPP_MORPH_CASE(CV_32FC3, 32f_C3R); |
| 1184 | IPP_MORPH_CASE(CV_32FC4, 32f_C4R); |
| 1185 | default: |
| 1186 | return false; |
| 1187 | } |
| 1188 | #undef IPP_MORPH_CASE |
| 1189 | |
| 1190 | IppiSize roiSize = {src.cols, src.rows}; |
| 1191 | IppiSize kernelSize = {ksize.width, ksize.height}; |
| 1192 | IppiPoint point = {anchor.x, anchor.y}; |
| 1193 | |
| 1194 | if( !rectKernel && morphFunc && initAllocFunc ) |
| 1195 | { |
| 1196 | IppiMorphState* pState; |
| 1197 | if( initAllocFunc( roiSize.width, kernel.data, kernelSize, point, &pState ) < 0 ) |
| 1198 | return false; |
| 1199 | bool is_ok = morphFunc( _src->data, (int)_src->step[0], |
| 1200 | dst.data, (int)dst.step[0], |
no test coverage detected