00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <filters/threshold.h>
00028
00029 #include <core/exception.h>
00030
00031 #include <cstddef>
00032 #include <ippi.h>
00033
00034 namespace firevision {
00035 #if 0
00036 }
00037 #endif
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 FilterThreshold::FilterThreshold(unsigned char min, unsigned char min_replace,
00050 unsigned char max, unsigned char max_replace)
00051 : Filter("FilterThreshold")
00052 {
00053 this->min = min;
00054 this->max = max;
00055 this->min_replace = min_replace;
00056 this->max_replace = max_replace;
00057 }
00058
00059
00060
00061
00062
00063
00064
00065
00066 void
00067 FilterThreshold::set_thresholds(unsigned char min, unsigned char min_replace,
00068 unsigned char max, unsigned char max_replace)
00069 {
00070 this->min = min;
00071 this->max = max;
00072 this->min_replace = min_replace;
00073 this->max_replace = max_replace;
00074 }
00075
00076
00077 void
00078 FilterThreshold::apply()
00079 {
00080 IppiSize size;
00081 size.width = src_roi[0]->width;
00082 size.height = src_roi[0]->height;
00083
00084 IppStatus status;
00085
00086 if ((dst == NULL) || (dst == src[0])) {
00087
00088 status = ippiThreshold_GTVal_8u_C1IR( src[0] + (src_roi[0]->start.y * src_roi[0]->line_step) + (src_roi[0]->start.x * src_roi[0]->pixel_step), src_roi[0]->line_step,
00089 size, max, max_replace );
00090 if ( status == ippStsNoErr ) {
00091 status = ippiThreshold_LTVal_8u_C1IR( src[0] + (src_roi[0]->start.y * src_roi[0]->line_step) + (src_roi[0]->start.x * src_roi[0]->pixel_step), src_roi[0]->line_step,
00092 size, min, min_replace );
00093 }
00094 } else {
00095
00096 status = ippiThreshold_GTVal_8u_C1R( src[0] + (src_roi[0]->start.y * src_roi[0]->line_step) + (src_roi[0]->start.x * src_roi[0]->pixel_step), src_roi[0]->line_step,
00097 dst + (dst_roi->start.y * dst_roi->line_step) + (dst_roi->start.x * dst_roi->pixel_step), dst_roi->line_step,
00098 size, max, max_replace );
00099
00100 if ( status == ippStsNoErr ) {
00101 status = ippiThreshold_LTVal_8u_C1R( src[0] + (src_roi[0]->start.y * src_roi[0]->line_step) + (src_roi[0]->start.x * src_roi[0]->pixel_step), src_roi[0]->line_step,
00102 dst + (dst_roi->start.y * dst_roi->line_step) + (dst_roi->start.x * dst_roi->pixel_step), dst_roi->line_step,
00103 size, min, min_replace );
00104 }
00105 }
00106
00107 if ( status != ippStsNoErr ) {
00108 throw fawkes::Exception("Threshold filter failed with %i\n", status);
00109 }
00110
00111 }
00112
00113 }