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 );
}
Ejemplo n.º 2
0
Archivo: ipp.c Proyecto: 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);

}