Esempio n. 1
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

}
void roiDetector::getPiramide(Ipp8u * img)
{
    int i;

    // XXX
    // Safe gauss code
    gaussSize.width = sizePir[0].width-2;
    gaussSize.height = sizePir[0].height-2;
    ippiFilterGauss_8u_C1R(img+sizePir[0].width+1, sizePir[0].width, (* EscpiramideG)[0]+sizePir[0].width+1, sizePir[0].width, gaussSize, ippMskSize3x3);
    // Memory fault prone gauss code?
    //ippiFilterGauss_8u_C1R(img,sizePir[0].width,(* EscpiramideG)[0],sizePir[0].width,sizePir[0],ippMskSize3x3);

    //ippiCopy_8u_C1R(img,sizePir[0].width,(* EscpiramideG[0]),sizePir[0].width,sizePir[0]);

    for (i=1; i<params.pyrLevels; i++)
        ippiPyrDown_Gauss5x5_8u_C1R((* EscpiramideG)[i-1],sizePir[i-1].width, (* EscpiramideG)[i],sizePir[i].width,sizePir[i-1],buftmpPirG);

    for (i=params.pyrLevels-1; i>0; i--) {
        ippiPyrUp_Gauss5x5_8u_C1R((* EscpiramideG)[i],sizePir[i].width,piramideL[i-1],sizePir[i-1].width,sizePir[i],buftmpPirL);
        //ippiSub_8u_C1RSfs((* EscpiramideG)[i-1],sizePir[i-1].width,piramideL[i-1],sizePir[i-1].width,piramideL[i-1],sizePir[i-1].width, sizePir[i-1],-1);
        ippiAbsDiff_8u_C1R((* EscpiramideG)[i-1],sizePir[i-1].width,piramideL[i-1],sizePir[i-1].width,piramideL[i-1],sizePir[i-1].width, sizePir[i-1]);
    }
}
Esempio n. 3
0
File: ipp.c Progetto: 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);

}