00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <filters/morphology/dilation.h>
00025
00026 #include <fvutils/color/yuv.h>
00027 #include <core/exception.h>
00028
00029 #include <cstddef>
00030 #include <ippi.h>
00031
00032 namespace firevision {
00033 #if 0
00034 }
00035 #endif
00036
00037
00038
00039
00040
00041
00042
00043
00044 FilterDilation::FilterDilation()
00045 : MorphologicalFilter("Morphological Dilation")
00046 {
00047 }
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 FilterDilation::FilterDilation(unsigned char *se,
00060 unsigned int se_width, unsigned int se_height,
00061 unsigned int se_anchor_x, unsigned int se_anchor_y)
00062 : MorphologicalFilter("Morphological Dilation")
00063 {
00064 this->se = se;
00065 this->se_width = se_width;
00066 this->se_height = se_height;
00067 this->se_anchor_x = se_anchor_x;
00068 this->se_anchor_y = se_anchor_y;
00069 }
00070
00071
00072 void
00073 FilterDilation::apply()
00074 {
00075 IppStatus status;
00076
00077 if ( se == NULL ) {
00078
00079
00080 IppiSize size;
00081 size.width = src_roi[0]->width - 2;
00082 size.height = src_roi[0]->height - 2;
00083
00084
00085 if ( (dst == NULL) || (dst == src[0]) ) {
00086
00087
00088
00089
00090 status = ippiDilate3x3_8u_C1IR(src[0] + ((src_roi[0]->start.y + 1) * src_roi[0]->line_step) + ((src_roi[0]->start.x + 1) * src_roi[0]->pixel_step),
00091 src_roi[0]->line_step,
00092 size);
00093
00094 } else {
00095
00096
00097 status = ippiDilate3x3_8u_C1R(src[0] + ((src_roi[0]->start.y + 1) * src_roi[0]->line_step) + ((src_roi[0]->start.x + 1) * src_roi[0]->pixel_step),
00098 src_roi[0]->line_step,
00099 dst + ((dst_roi->start.y + 1) * dst_roi->line_step) + ((dst_roi->start.x + 1) * dst_roi->pixel_step),
00100 dst_roi->line_step,
00101 size);
00102
00103 yuv422planar_copy_uv(src[0], dst,
00104 src_roi[0]->image_width, src_roi[0]->image_height,
00105 src_roi[0]->start.x, src_roi[0]->start.y,
00106 src_roi[0]->width, src_roi[0]->height );
00107 }
00108 } else {
00109
00110
00111 IppiSize size;
00112 size.width = src_roi[0]->width - se_width;
00113 size.height = src_roi[0]->height - se_width;
00114
00115 IppiSize mask_size = { se_width, se_height };
00116 IppiPoint mask_anchor = { se_anchor_x, se_anchor_y };
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129 if ( (dst == NULL) || (dst == src[0]) ) {
00130
00131
00132 status = ippiDilate_8u_C1IR(src[0] + ((src_roi[0]->start.y + (se_height / 2)) * src_roi[0]->line_step) + ((src_roi[0]->start.x + (se_width / 2)) * src_roi[0]->pixel_step),
00133 src_roi[0]->line_step,
00134 size,
00135 se, mask_size, mask_anchor);
00136
00137 } else {
00138
00139
00140 status = ippiDilate_8u_C1R(src[0] + ((src_roi[0]->start.y + (se_height / 2)) * src_roi[0]->line_step) + ((src_roi[0]->start.x + (se_width / 2)) * src_roi[0]->pixel_step),
00141 src_roi[0]->line_step,
00142 dst + ((dst_roi->start.y + (se_height / 2)) * dst_roi->line_step) + ((dst_roi->start.x + (se_width / 2)) * dst_roi->pixel_step),
00143 dst_roi->line_step,
00144 size,
00145 se, mask_size, mask_anchor);
00146
00147 yuv422planar_copy_uv(src[0], dst,
00148 src_roi[0]->image_width, src_roi[0]->image_height,
00149 src_roi[0]->start.x, src_roi[0]->start.y,
00150 src_roi[0]->width, src_roi[0]->height );
00151
00152 }
00153 }
00154
00155 if ( status != ippStsNoErr ) {
00156 throw fawkes::Exception("Morphological dilation failed with %i\n", status);
00157 }
00158
00159 }
00160
00161 }