23 #include <fvfilters/sobel.h>
25 #include <core/exception.h>
29 #elif defined(HAVE_OPENCV)
32 # error "Neither IPP nor OpenCV available"
36 namespace firevision {
49 FilterSobel::FilterSobel(orientation_t ori)
73 k[0] = 1; k[1] = 2; k[2] = 1;
74 k[3] = 0; k[4] = 0; k[5] = 0;
75 k[6] = -1; k[7] = -2; k[8] = -1;
78 k[0] = 2; k[1] = 1; k[2] = 0;
79 k[3] = 1; k[4] = 0; k[5] = -1;
80 k[6] = 0; k[7] = -1; k[8] = -2;
83 k[0] = 1; k[1] = 0; k[2] = -1;
84 k[3] = 2; k[4] = 0; k[5] = -2;
85 k[6] = 1; k[7] = 0; k[8] = -1;
88 k[0] = 0; k[1] = -1; k[2] = -2;
89 k[3] = 1; k[4] = 0; k[5] = -1;
90 k[6] = 2; k[7] = 1; k[8] = 0;
93 k[0] = -1; k[1] = -2; k[2] = -1;
94 k[3] = 0; k[4] = 0; k[5] = 0;
95 k[6] = 1; k[7] = 2; k[8] = 1;
98 k[0] = -2; k[1] = -1; k[2] = 0;
99 k[3] = -1; k[4] = 0; k[5] = 1;
100 k[6] = 0; k[7] = 1; k[8] = 2;
103 k[0] = -1; k[1] = 0; k[2] = 1;
104 k[3] = -2; k[4] = 0; k[5] = 2;
105 k[6] = -1; k[7] = 0; k[8] = 1;
108 k[0] = 0; k[1] = 1; k[2] = 2;
109 k[3] = -1; k[4] = 0; k[5] = 1;
110 k[6] = -2; k[7] = -1; k[8] = 0;
113 throw fawkes::Exception(
"Cannot generate Sobel kernel for the given orientation");
124 #if defined(HAVE_IPP)
131 if (ori[0] == ORI_HORIZONTAL) {
136 }
else if (ori[0] == ORI_VERTICAL) {
141 }
else if ( (ori[0] == ORI_DEG_0) ||
142 (ori[0] == ORI_DEG_45) ||
143 (ori[0] == ORI_DEG_90) ||
144 (ori[0] == ORI_DEG_135) ||
145 (ori[0] == ORI_DEG_180) ||
146 (ori[0] == ORI_DEG_225) ||
147 (ori[0] == ORI_DEG_270) ||
148 (ori[0] == ORI_DEG_315) ||
149 (ori[0] == ORI_DEG_360)
153 generate_kernel(kernel, ori[0]);
155 IppiSize kernel_size;
156 kernel_size.width = kernel_size.height = 3;
159 anchor.x = anchor.y = 1;
170 status = ippStsNullPtrErr;
173 if ( status != ippStsNoErr ) {
176 #elif defined(HAVE_OPENCV)
181 src_roi[0]->line_step);
191 if (ori[0] == ORI_HORIZONTAL) {
196 cv::Sobel(srcm, dstm, -1, 1, 0,
198 }
else if (ori[0] == ORI_VERTICAL) {
203 cv::Sobel(srcm, dstm, -1, 0, 1,
205 }
else if ( (ori[0] == ORI_DEG_0) ||
206 (ori[0] == ORI_DEG_45) ||
207 (ori[0] == ORI_DEG_90) ||
208 (ori[0] == ORI_DEG_135) ||
209 (ori[0] == ORI_DEG_180) ||
210 (ori[0] == ORI_DEG_225) ||
211 (ori[0] == ORI_DEG_270) ||
212 (ori[0] == ORI_DEG_315) ||
213 (ori[0] == ORI_DEG_360)
216 cv::Mat kernel(3, 3, CV_32F);
217 generate_kernel((
float *)kernel.ptr(), ori[0]);
219 cv::filter2D(srcm, dstm, -1, kernel, cv::Point(1, 1));
fawkes::point_t start
ROI start.
unsigned int x
x coordinate
unsigned int width
ROI width.
virtual void apply()
Apply the filter.
void shrink_region(ROI *r, unsigned int n)
This shrinks the regions as needed for a N x N matrix.
unsigned char ** src
Source buffers, dynamically allocated by Filter ctor.
Base class for exceptions in Fawkes.
unsigned int y
y coordinate
ROI ** src_roi
Source ROIs, dynamically allocated by Filter ctor.
unsigned int height
ROI height.
unsigned int line_step
line step
unsigned char * dst
Destination buffer.
unsigned int pixel_step
pixel step
ROI * dst_roi
Destination ROI.