void CueContrastKernel::obtainInput() { CVImage* cvgrayimg = cvGrayImageIn.getBuffer(); if(!cvgrayimg) { std::cerr << getName() << "::execute()::ERROR::cvGrayImageIn is NULL!\n"; return; } if(!mp_cvimg1) { CvSize imgsize = cvSize(cvgrayimg->width, cvgrayimg->height); mp_cvimg1 = new CVImage(imgsize, CV_8UC1, 0); mp_cvimg2 = new CVImage(imgsize, CV_8UC1, 0); mp_cvminimg = new CVImage(imgsize, CV_8UC1, 0); mp_cvmaximg = new CVImage(imgsize, CV_8UC1, 0); mdp_cvimg[0] = mp_cvimg1; mdp_cvimg[1] = mp_cvimg2; } Ipp8u* srcData = (Ipp8u*)(cvgrayimg->ipl->imageData); int width = cvgrayimg->width; int height = cvgrayimg->height; for(unsigned int i = 0;i<m_dimData;++i){ int scale = m_contrastscale[i]; IppiSize kernel1 = {scale, scale}; IppiPoint anchor1 = {(scale-1)>>2, (scale-1)>>2}; IppiSize roi1 = {width-scale+1, height-scale+1}; Ipp8u* targetData = (Ipp8u*)(mp_cvminimg->ipl->imageData); ippiFilterMin_8u_C1R(srcData, width, targetData, width, roi1, kernel1, anchor1); targetData = (Ipp8u*)(mp_cvmaximg->ipl->imageData); ippiFilterMax_8u_C1R(srcData, width, targetData, width, roi1, kernel1, anchor1); unsigned char* maxdata = (unsigned char*)(mp_cvmaximg->ipl->imageData); unsigned char* mindata = (unsigned char*)(mp_cvminimg->ipl->imageData); unsigned char* contdata = (unsigned char*)(mdp_cvimg[i]->ipl->imageData); int widthstep = mdp_cvimg[i]->ipl->widthStep; for(int y = 0; y < height; ++y) { for(int x = 0; x < width; ++x) { int pos = x + y*widthstep; float tempmin = (float)(mindata[pos]); float tempmax = (float)(maxdata[pos]); if ( (tempmin + tempmax) != 0.0 ) contdata[pos] = cvRound((tempmax-tempmin)/(tempmax+tempmin)*255.0); else contdata[pos] = 0; } } } cvImage1Out.setBuffer(mdp_cvimg[0]); cvImage1Out.out(); cvImage2Out.setBuffer(mdp_cvimg[1]); cvImage2Out.out(); /* CVImage* cvrgbimg = cvImageIn.getBuffer(); if(!cvrgbimg) { std::cerr << getName() << "::execute()::ERROR::cvImageIn is NULL!\n"; return; } if(!mp_cvimg1) { CvSize imgsize = cvSize(cvrgbimg->width, cvrgbimg->height); mp_cvimg1 = new CVImage(imgsize, CV_8UC1, 0); mp_cvimg2 = new CVImage(imgsize, CV_8UC1, 0); mp_cvimg3 = new CVImage(imgsize, CV_8UC1, 0); } if(m_colormode == USE_RGB){ cvCvtPixToPlane( cvrgbimg->ipl, mp_cvimg3->ipl, mp_cvimg2->ipl, mp_cvimg1->ipl, NULL ); } else if(m_colormode == USE_HSV || m_colormode == USE_HS){ if(!mp_cvhsvimg) { CvSize imgsize = cvSize(cvrgbimg->width, cvrgbimg->height); mp_cvhsvimg = new CVImage(imgsize, CV_8UC3, 0); } cvCvtColor( cvrgbimg->ipl, mp_cvhsvimg->ipl, CV_BGR2HSV); cvCvtPixToPlane( mp_cvhsvimg->ipl, mp_cvimg1->ipl, mp_cvimg2->ipl, mp_cvimg3->ipl, NULL ); } mdp_cvimg[0] = mp_cvimg1; mdp_cvimg[1] = mp_cvimg2; mdp_cvimg[2] = mp_cvimg3; cvImage1Out.setBuffer(mp_cvimg1); cvImage1Out.out(); cvImage2Out.setBuffer(mp_cvimg2); cvImage2Out.out(); cvImage3Out.setBuffer(mp_cvimg3); cvImage3Out.out(); */ } void CueContrastKernel::cropNResize(CvPoint2D32f* pos, CvSize* size, float hval) { if(!mp_cvmaskimg){ mp_cvmaskimg = new CVImage(*size, CV_8UC1, 0); } CvRect inputrect; inputrect.x = cvRound((float)pos->x - (float)size->width/2.0); inputrect.y = cvRound((float)pos->y - (float)size->height/2.0); inputrect.width = size->width; inputrect.height = size->height; for(unsigned int i = 0;i<m_dimData;++i) { mdpCropResize[i]->cvImageIn.setBuffer(mdp_cvimg[i]); mdpCropResize[i]->rectIn.setBuffer(&inputrect); mdpCropResize[i]->sizeIn.setBuffer(size); mdpCropResize[i]->execute(); mdp_cvcroppedimg[i] = mdpCropResize[i]->cvImageOut.getBuffer(); } CvPoint maskcenter; maskcenter.x = cvRound((float)(size->width)/2.0 - 1.0); maskcenter.y = cvRound((float)(size->height)/2.0 - 1.0); CvSize maskaxis; maskaxis.width = cvRound((float)(size->width)/2.0 - 1.0); maskaxis.height = cvRound((float)(size->height)/2.0 - 1.0); drawEllipse(mp_cvmaskimg, &maskcenter, &maskaxis); cvTemplateOut.setBuffer(mdp_cvcroppedimg[0]); cvTemplateOut.out(); cvMaskOut.setBuffer(mp_cvmaskimg); cvMaskOut.out(); } void CueContrastKernel::drawEllipse(CVImage* maskimg, CvPoint* maskcenter, CvSize* maskaxis) { cvSetZero(maskimg->ipl); float angle = 0; float startAngle = 0; float endAngle = 360; int thickness = -1; cvEllipse( maskimg->ipl, *maskcenter, *maskaxis, angle, startAngle, endAngle, CV_RGB(255,255,255), thickness ); }
//실행부분 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); }