Пример #1
0
void
FilterOr::apply()
{
#ifdef HAVE_IPP
  IppiSize size;
  size.width = src_roi[0]->width;
  size.height = src_roi[0]->height;

  IppStatus status;

  if ( (dst == NULL) || (dst == src[1]) ) {
    // In-place
    status = ippiOr_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,
			    src[1] + (src_roi[1]->start.y * src_roi[1]->line_step) + (src_roi[1]->start.x * src_roi[1]->pixel_step),
			    src_roi[1]->line_step,
			    size);
    
  } else {
    status = ippiOr_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,
			   src[1] + (src_roi[1]->start.y * src_roi[1]->line_step) + (src_roi[1]->start.x * src_roi[1]->pixel_step),
			   src_roi[1]->line_step,
			   dst + (dst_roi->start.y * dst_roi->line_step) + (dst_roi->start.x * dst_roi->pixel_step),
			   dst_roi->line_step,
			   size);
  }

  if ( status != ippStsNoErr ) {
    throw fawkes::Exception("Or filter failed with %i\n", status);
  }
#elif defined(HAVE_OPENCV)

  if ((dst == NULL) || (dst == src[0])) {
    throw fawkes::Exception("OpenCV-based OR filter cannot be in-place");
  }

  cv::Mat srcm_0(src_roi[0]->height, src_roi[0]->width, CV_8UC1,
                 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);

  cv::Mat srcm_1(src_roi[1]->height, src_roi[1]->width, CV_8UC1,
                 src[1] +
                   (src_roi[1]->start.y * src_roi[1]->line_step) +
                   (src_roi[1]->start.x * src_roi[1]->pixel_step),
                 src_roi[1]->line_step);

  cv::Mat dstm(dst_roi->height, dst_roi->width, CV_8UC1,
               dst +
                 (dst_roi->start.y * dst_roi->line_step) +
                 (dst_roi->start.x * dst_roi->pixel_step),
               dst_roi->line_step);

  cv::bitwise_or(srcm_0, srcm_1, dstm);

#endif
}
Пример #2
0
void
FilterGauss::apply()
{
#if defined(HAVE_IPP)
  IppiSize size;
  size.width = src_roi[0]->width;
  size.height = src_roi[0]->height;

  /* IppStatus status = */ ippiFilterGauss_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,
						   dst + (dst_roi->start.y * dst_roi->line_step) + (dst_roi->start.x * dst_roi->pixel_step), dst_roi->line_step,
						   size,
						   ippMskSize5x5 );

  /*
  cout << "FilterGauss: ippiFilterGauss exit code: " << flush;
  switch (status) {
  case ippStsNoErr:
    cout << "ippStsNoErr";
    break;
  case ippStsNullPtrErr:
    cout << "ippStsNullPtrErr";
    break;
  case ippStsSizeErr:
    cout << "ippStsSizeErr";
    break;
  case ippStsStepErr:
    cout << "ippStsStepErr";
    break;
  case ippStsMaskSizeErr:
    cout << "ippStsMaskSizeErr";
    break;
  default:
    cout << "Unknown status";
  }
  cout << endl;
  */

#elif defined(HAVE_OPENCV)
  cv::Mat srcm(src_roi[0]->height, src_roi[0]->width, CV_8UC1,
               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);

  if (dst == NULL) { dst = src[0]; dst_roi = src_roi[0]; }

  cv::Mat dstm(dst_roi->height, dst_roi->width, CV_8UC1,
               dst +
                 (dst_roi->start.y * dst_roi->line_step) +
                 (dst_roi->start.x * dst_roi->pixel_step),
               dst_roi->line_step);

  cv::GaussianBlur(srcm, dstm, /* ksize */ cv::Size(5, 5), /* sigma */ 1.0);

#endif

}
Пример #3
0
void
FilterSharpen::apply()
{
#if defined(HAVE_IPP)
  IppiSize size;
  size.width = src_roi[0]->width;
  size.height = src_roi[0]->height;

  IppStatus status;

  //                                   base + number of bytes to line y              + pixel bytes
  status = ippiFilterSharpen_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,
				     dst + (dst_roi->start.y * dst_roi->line_step) + (dst_roi->start.x * dst_roi->pixel_step), dst_roi->line_step,
				     size );

  if ( status != ippStsNoErr ) {
    throw fawkes::Exception("Sharpen filter failed with %i\n", status);
  }
#elif defined(HAVE_OPENCV)
  if ((dst == NULL) || (dst == src[0])) {
    throw fawkes::Exception("OpenCV-based Sobel filter cannot be in-place");
  }

  cv::Mat srcm(src_roi[0]->height, src_roi[0]->width, CV_8UC1,
               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);

  cv::Mat dstm(dst_roi->height, dst_roi->width, CV_8UC1,
               dst +
                 (dst_roi->start.y * dst_roi->line_step) +
                 (dst_roi->start.x * dst_roi->pixel_step),
               dst_roi->line_step);

  cv::Mat kernel(3, 3, CV_32F);
  float *kernel_f = (float *)kernel.ptr();
  kernel_f[0] = -0.125; kernel_f[1] = -0.125; kernel_f[2] = -0.125;
  kernel_f[3] = -0.125; kernel_f[4] = 2.0;    kernel_f[5] = -0.125;
  kernel_f[6] = -0.125; kernel_f[7] = -0.125; kernel_f[8] = -0.125;

  cv::Point kanchor(1, 1);

  cv::filter2D(srcm, dstm, /* ddepth */ -1, kernel, kanchor);

#endif

}
Пример #4
0
void
FilterHipass::apply()
{
#if defined(HAVE_IPP)
  IppiSize size;
  size.width = src_roi[0]->width;
  size.height = src_roi[0]->height;

  IppStatus status;

  //                                    base + number of bytes to line y              + pixel bytes
  status = ippiFilterHipass_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,
				    dst + (dst_roi->start.y * dst_roi->line_step) + (dst_roi->start.x * dst_roi->pixel_step), dst_roi->line_step,
				    size, ippMskSize3x3 );

  if ( status != ippStsNoErr ) {
    throw fawkes::Exception("Hipass filter failed with %i\n", status);
  }

#elif defined(HAVE_OPENCV)
  cv::Mat srcm(src_roi[0]->height, src_roi[0]->width, CV_8UC1,
               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);

  if (dst == NULL) { dst = src[0]; dst_roi = src_roi[0]; }

  cv::Mat dstm(dst_roi->height, dst_roi->width, CV_8UC1,
               dst +
                 (dst_roi->start.y * dst_roi->line_step) +
                 (dst_roi->start.x * dst_roi->pixel_step),
               dst_roi->line_step);

  cv::Mat kernel(3, 3, CV_32F);
  float *kernel_f = (float *)kernel.ptr();
  kernel_f[0] = -1; kernel_f[1] = -1; kernel_f[2] = -1;
  kernel_f[3] = -1; kernel_f[4] =  8; kernel_f[5] = -1;
  kernel_f[6] = -1; kernel_f[7] = -1; kernel_f[8] = -1;

  cv::Point kanchor(1, 1);

  cv::filter2D(srcm, dstm, /* ddepth */ -1, kernel, kanchor);
#endif
}
Пример #5
0
void
FilterDilation::apply()
{
#if defined(HAVE_IPP)
	IppStatus status;

	if (se == NULL) {
		// standard 3x3 dilation

		IppiSize size;
		size.width  = src_roi[0]->width - 2;
		size.height = src_roi[0]->height - 2;

		if ((dst == NULL) || (dst == src[0])) {
			// In-place

			// std::cout << "Running in-place with standard SE" << std::endl;

			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),
			                               src_roi[0]->line_step,
			                               size);

		} else {
			// std::cout << "Running not in-place dilation with standard SE" << std::endl;

			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),
			                              src_roi[0]->line_step,
			                              dst + ((dst_roi->start.y + 1) * dst_roi->line_step)
			                                + ((dst_roi->start.x + 1) * dst_roi->pixel_step),
			                              dst_roi->line_step,
			                              size);

			yuv422planar_copy_uv(src[0],
			                     dst,
			                     src_roi[0]->image_width,
			                     src_roi[0]->image_height,
			                     src_roi[0]->start.x,
			                     src_roi[0]->start.y,
			                     src_roi[0]->width,
			                     src_roi[0]->height);
		}
	} else {
		// we have a custom SE

		IppiSize size;
		size.width  = src_roi[0]->width - se_width;
		size.height = src_roi[0]->height - se_width;

		IppiSize  mask_size   = {se_width, se_height};
		IppiPoint mask_anchor = {se_anchor_x, se_anchor_y};

		/*
    std::cout << "Dilation filter is running with the following parameters:" << std::endl
	      << "  ROI size:    " << size.width << " x " << size.height << std::endl
	      << "  mask size:   " << mask_size.width << " x " << mask_size.height << std::endl
	      << "  mask anchor: (" << mask_anchor.x  << "," << mask_anchor.y << ")" << std::endl
	      << std::endl;

    printf("  src buf:     0x%x\n", (unsigned int)src );
    printf("  dst buf:     0x%x\n", (unsigned int)dst );
    */

		if ((dst == NULL) || (dst == src[0])) {
			// In-place

			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),
			                     src_roi[0]->line_step,
			                     size,
			                     se,
			                     mask_size,
			                     mask_anchor);

		} else {
			//std::cout << "Running NOT in-place" << std::endl;

			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),
			                    src_roi[0]->line_step,
			                    dst + ((dst_roi->start.y + (se_height / 2)) * dst_roi->line_step)
			                      + ((dst_roi->start.x + (se_width / 2)) * dst_roi->pixel_step),
			                    dst_roi->line_step,
			                    size,
			                    se,
			                    mask_size,
			                    mask_anchor);

			yuv422planar_copy_uv(src[0],
			                     dst,
			                     src_roi[0]->image_width,
			                     src_roi[0]->image_height,
			                     src_roi[0]->start.x,
			                     src_roi[0]->start.y,
			                     src_roi[0]->width,
			                     src_roi[0]->height);
		}
	}

	if (status != ippStsNoErr) {
		throw fawkes::Exception("Morphological dilation failed with %i\n", status);
	}
#elif defined(HAVE_OPENCV)
	cv::Mat srcm(src_roi[0]->height,
	             src_roi[0]->width,
	             CV_8UC1,
	             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);

	if (dst == NULL) {
		dst     = src[0];
		dst_roi = src_roi[0];
	}

	cv::Mat dstm(dst_roi->height,
	             dst_roi->width,
	             CV_8UC1,
	             dst + (dst_roi->start.y * dst_roi->line_step)
	               + (dst_roi->start.x * dst_roi->pixel_step),
	             dst_roi->line_step);

	if (se == NULL) {
		cv::dilate(srcm, dstm, cv::Mat());
	} else {
		cv::Mat   sem(se_width, se_height, CV_8UC1);
		cv::Point sem_anchor(se_anchor_x, se_anchor_y);
		cv::dilate(srcm, dstm, sem, sem_anchor);
	}
#endif
}