// 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 ); }
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); }
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); }
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); }
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); }
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; }
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); }
// 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 ); }