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]); } }
//실행부분 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); }