示例#1
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

}
示例#2
0
文件: ipp.c 项目: AmesianX/pilot
//실행부분
void CIPPDlg::OnBnClickedButton1()
{
	UpdateData(TRUE);
	CWaitCursor wait;
	LARGE_INTEGER frequency, tStart, tEnd;
	QueryPerformanceFrequency(&frequency);
	IppiSize maskSize = { 3, 3 };
	IppiPoint anchor = { 1, 1 };
	IppiSize sizeSrc = { m_nWidth, m_nHeight };
	IppiSize sizeDst = { m_nWidth, m_nHeight };
	IppiSize szFiltter = { m_nWidth - 2, m_nHeight - 2 };// Filter ROI Size 3x3=2, 5x5=4

	// Step Size
	int nStepSrc = (8 * sizeSrc.width + 31) / 32 * 4;// Step = ((BitSize * Width + 31) / 32) * 4
	int nStepDst = (8 * sizeDst.width + 31) / 32 * 4;
	int nStepTmp = (8 * szFiltter.width + 31) / 32 * 4;
	// 메모리 할당
	Ipp8u* pipDataSrc = ippiMalloc_8u_C1(sizeSrc.width, sizeSrc.height, &nStepSrc);
	Ipp8u* pipDataDst = ippiMalloc_8u_C1(sizeDst.width, sizeDst.height, &nStepDst);
	//Ipp8u* pipDataTmp = (Ipp8u*)ippMalloc( nStepTmp * szFiltter.height);

	IppStatus status = ippStsNoErr;

	// 메모리 초기화
	status = ippiImageJaehne_8u_C1R(pipDataSrc, nStepSrc, sizeSrc);
	status = ippiImageJaehne_8u_C1R(pipDataDst, nStepDst, sizeDst);
	//status = ippiImageJaehne_8u_C1R(pipDataTmp, nStepTmp, szFiltter);
	GetDlgItem(IDC_STATUS)->SetWindowText(ippGetStatusString(status));
	// 원본 버퍼저장
	CStdioFile rfile1;
	rfile1.Open("c:\\ipp_8u_1.raw", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
	rfile1.Write(pipDataSrc, sizeof(Ipp8u)*nStepSrc*m_nHeight);
	rfile1.Close();

	// ROI 시작부분 계산
	Ipp8u* pipSrcROI = (Ipp8u*)(((Ipp8u*)pipDataSrc) + anchor.y * nStepSrc + anchor.x * sizeof(Ipp8u));
	Ipp8u* pipDstROI = (Ipp8u*)(((Ipp8u*)pipDataDst) + anchor.y * nStepDst + anchor.x * sizeof(Ipp8u));
	QueryPerformanceCounter(&tStart);
	switch (m_idxFilter)
	{
	case 0://Sharpen
		status = ippiFilterSharpen_8u_C1R(pipSrcROI, nStepSrc, pipDstROI, nStepDst, szFiltter);
		break;
	case 1://Lowpass
		status = ippiFilterLowpass_8u_C1R(pipSrcROI, nStepSrc, pipDstROI, nStepDst, szFiltter, ippMskSize3x3);
		break;
	case 2://Hipass
		status = ippiFilterHipass_8u_C1R(pipSrcROI, nStepSrc, pipDstROI, nStepDst, szFiltter, ippMskSize3x3);
		break;
	case 3://Gauss
		status = ippiFilterGauss_8u_C1R(pipSrcROI, nStepSrc, pipDstROI, nStepDst, szFiltter, ippMskSize3x3);
		break;
	case 4://Median
		status = ippiFilterMedian_8u_C1R(pipSrcROI, nStepSrc, pipDstROI, nStepDst, szFiltter, maskSize, anchor);
		break;
	case 5://Min
		status = ippiFilterMin_8u_C1R(pipSrcROI, nStepSrc, pipDstROI, nStepDst, szFiltter, maskSize, anchor);
		break;
	case 6://Max
		status = ippiFilterMax_8u_C1R(pipSrcROI, nStepSrc, pipDstROI, nStepDst, szFiltter, maskSize, anchor);
		break;
	case 7://Laplace
		status = ippiFilterLaplace_8u_C1R(pipSrcROI, nStepSrc, pipDstROI, nStepDst, szFiltter, ippMskSize3x3);
		break;
	case 8://Wiener
	{
			   int size = 0;
			   status = ippiFilterWienerGetBufferSize(szFiltter, maskSize, 1, &size);
			   Ipp8u* pBuffer = new Ipp8u[size + 2];
			   Ipp32f noise = 0;
			   status = ippiFilterWiener_8u_C1R(pipSrcROI, nStepSrc, pipDstROI, nStepDst, szFiltter, maskSize, anchor, &noise, (Ipp8u*)pBuffer);
			   delete pBuffer;
	}
		break;
	}
	QueryPerformanceCounter(&tEnd);
	// 필터링된 버퍼저장
	CStdioFile rfile2;
	rfile2.Open("c:\\ipp_8u_2.raw", CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
	rfile2.Write(pipDataDst, sizeof(Ipp8u)*nStepDst * sizeDst.height);
	rfile2.Close();
	Ipp64f Mean = 0;
	Ipp64f StdDev = 0;
	status = ippiMean_StdDev_8u_C1R(pipDataDst, nStepDst, sizeDst, &Mean, &StdDev);
	// 메모리 해제
	ippiFree(pipDataSrc);
	ippiFree(pipDataDst);
	//ippiFree(pipDataTmp);
	GetDlgItem(IDC_STATUS)->SetWindowText(ippGetStatusString(status));

	// 수행시간 계산
	CString strTime;
	strTime.Format("%3.5f msec\r\nMean = %3.2f , StdDev = %3.2f", (double)((tEnd.QuadPart - tStart.QuadPart) / (double)frequency.QuadPart)*(double)1000., Mean, StdDev);
	GetDlgItem(IDC_TIME)->SetWindowText(strTime);

}