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