コード例 #1
0
// define a trackbar callback
void on_trackbar( int h )
{
    int j;
    int distStep = dist -> widthStep / 4;
    float* currPointer;
    
    cvThreshold( gray, edge,
                 ( float )( edge_thresh ),
                 ( float )( edge_thresh ),
                  CV_THRESH_BINARY );
    //Distance transform                  
    cvDistTransform( edge, dist,
                     CV_DIST_L2,
                     CV_DIST_MASK_5,
                     NULL );

    cvConvertScale( dist, dist, 5000.0, 0 );
    
    for( j = 0, currPointer = dist -> imageData; j < dist -> height; j++, currPointer += distStep )
    {
        cvbSqrt( ( float* )( currPointer ),
                 ( float* )( currPointer ),
                 dist -> width );            
    }
    
    cvConvertScale( dist, dist32s, 1.0, 0.5 );
    cvAndS( dist32s, cvScalarAll(255), dist32s, 0 );
    cvConvertScale( dist32s, dist8u1, 1, 0 );
    cvConvertScale( dist32s, dist32s, -1, 0 );
    cvAddS( dist32s, cvScalarAll(255), dist32s, 0 );
    cvConvertScale( dist32s, dist8u2, 1, 0 );
    cvCvtPlaneToPix( dist8u1, dist8u2, dist8u2, 0, dist8u );
    show_iplimage( wndname, dist8u );
}
コード例 #2
0
ファイル: cvdistransform.cpp プロジェクト: lubyk/cv
void cv::distanceTransform( const Mat& src, Mat& dst,
                            int distanceType, int maskSize )
{
    dst.create(src.size(), CV_32F);
    CvMat _src = src, _dst = dst;
    cvDistTransform(&_src, &_dst, distanceType, maskSize, 0, 0);
}
コード例 #3
0
ファイル: cvdistransform.cpp プロジェクト: lubyk/cv
void cv::distanceTransform( const Mat& src, Mat& dst, Mat& labels,
                            int distanceType, int maskSize )
{
    dst.create(src.size(), CV_32F);
    labels.create(src.size(), CV_32S);
    CvMat _src = src, _dst = dst, _labels = labels;
    cvDistTransform(&_src, &_dst, distanceType, maskSize, 0, &_labels);
}
コード例 #4
0
ファイル: distransform.cpp プロジェクト: 2693/opencv
void cv::distanceTransform( InputArray _src, OutputArray _dst,
                            int distanceType, int maskSize )
{
    Mat src = _src.getMat();
    _dst.create(src.size(), CV_32F);
    Mat dst = _dst.getMat();
    CvMat c_src = src, c_dst = _dst.getMat();
    cvDistTransform(&c_src, &c_dst, distanceType, maskSize, 0, 0, -1);
}
コード例 #5
0
ファイル: distransform.cpp プロジェクト: 2693/opencv
void cv::distanceTransform( InputArray _src, OutputArray _dst, OutputArray _labels,
                            int distanceType, int maskSize, int labelType )
{
    Mat src = _src.getMat();
    _dst.create(src.size(), CV_32F);
    _labels.create(src.size(), CV_32S);
    CvMat c_src = src, c_dst = _dst.getMat(), c_labels = _labels.getMat();
    cvDistTransform(&c_src, &c_dst, distanceType, maskSize, 0, &c_labels, labelType);
}
コード例 #6
0
CvPoint CTransformImage::findCenter()
{
	IplImage* dist8u  = cvCloneImage(m_transImage);
	IplImage* dist32f = cvCreateImage(cvGetSize(m_transImage), IPL_DEPTH_32F, 1);
	IplImage* dist32s = cvCreateImage(cvGetSize(m_transImage), IPL_DEPTH_32S, 1);

	// 거리 변환 행렬
	float mask[3] = {1.f, 1.5f, 0};

	// 거리 변환 함수 사용
	cvDistTransform(m_transImage, dist32f, CV_DIST_USER, 3, mask, NULL);

	// 눈에 보이게 변환
	cvConvertScale(dist32f, dist32f, 1000, 0);
	cvPow(dist32f, dist32f, 0.5);

	cvConvertScale(dist32f, dist32s, 1.0, 0.5);
	cvAndS(dist32s, cvScalarAll(255), dist32s, 0);
	cvConvertScale(dist32s, dist8u, 1, 0);

	// 가장 큰 좌표를 찾는다
	int max;
	for(int i = max = 0; i < dist8u->height; ++i)
	{
		int index = i * dist8u->widthStep;
		for(int j = 0; j < dist8u->width; ++j)
		{
			if((unsigned char)dist8u->imageData[index+j] > max)
			{
				max = (unsigned char)dist8u->imageData[index+j];
				m_center.x = j, m_center.y = i;
			}
		}
	}

	cvReleaseImage(&dist8u);
	cvReleaseImage(&dist32f);
	cvReleaseImage(&dist32s);

	if(m_center.x < 0 || m_center.y < 0)
		m_center.x = 0, m_center.y = 0;

	CvBox2D box;
	box.center = cvPoint2D32f(m_center.x, m_center.y);
	box.size   = cvSize2D32f(3, 3);
	box.angle  = 90;
	cvEllipseBox(m_image, box, CV_RGB(255,242,0), 3);

	return m_center;
}
コード例 #7
0
void moDistanceTransformModule::applyFilter(IplImage *src) {
	cvConvertImage(src, this->converted);

	cvDistTransform(
			 this->converted,
			 this->dist,
			 this->toCvType(this->property("metric").asString()),
			 this->toCvMaskSize(this->property("mask_size").asString())
			 );
	// In order to actually see something in the output, we have to scale the
	// result for visibility.
	cvConvertScale(this->dist, this->output_buffer,
				   this->property("scale").asInteger(), 0);
}
コード例 #8
0
ファイル: distrans.c プロジェクト: JackJone/opencv
// threshold trackbar callback
void on_trackbar( int dummy )
{
    static const uchar colors[][3] = 
    {
        {0,0,0},
        {255,0,0},
        {255,128,0},
        {255,255,0},
        {0,255,0},
        {0,128,255},
        {0,255,255},
        {0,0,255},
        {255,0,255}
    };
    
    int msize = mask_size;
    int _dist_type = build_voronoi ? CV_DIST_L2 : dist_type;

    cvThreshold( gray, edge, (float)edge_thresh, (float)edge_thresh, CV_THRESH_BINARY );

    if( build_voronoi )
        msize = CV_DIST_MASK_5;

    if( _dist_type == CV_DIST_L1 )
    {
        cvDistTransform( edge, edge, _dist_type, msize, NULL, NULL );
        cvConvert( edge, dist );
    }
    else
        cvDistTransform( edge, dist, _dist_type, msize, NULL, build_voronoi ? labels : NULL );

    if( !build_voronoi )
    {
        // begin "painting" the distance transform result
        cvConvertScale( dist, dist, 5000.0, 0 );
        cvPow( dist, dist, 0.5 );
    
        cvConvertScale( dist, dist32s, 1.0, 0.5 );
        cvAndS( dist32s, cvScalarAll(255), dist32s, 0 );
        cvConvertScale( dist32s, dist8u1, 1, 0 );
        cvConvertScale( dist32s, dist32s, -1, 0 );
        cvAddS( dist32s, cvScalarAll(255), dist32s, 0 );
        cvConvertScale( dist32s, dist8u2, 1, 0 );
        cvMerge( dist8u1, dist8u2, dist8u2, 0, dist8u );
        // end "painting" the distance transform result
    }
    else
    {
        int i, j;
        for( i = 0; i < labels->height; i++ )
        {
            int* ll = (int*)(labels->imageData + i*labels->widthStep);
            float* dd = (float*)(dist->imageData + i*dist->widthStep);
            uchar* d = (uchar*)(dist8u->imageData + i*dist8u->widthStep);
            for( j = 0; j < labels->width; j++ )
            {
                int idx = ll[j] == 0 || dd[j] == 0 ? 0 : (ll[j]-1)%8 + 1;
                int b = cvRound(colors[idx][0]);
                int g = cvRound(colors[idx][1]);
                int r = cvRound(colors[idx][2]);
                d[j*3] = (uchar)b;
                d[j*3+1] = (uchar)g;
                d[j*3+2] = (uchar)r;
            }
        }
    }
    
    cvShowImage( wndname, dist8u );
}