CV_IMPL int cvSampleLine( const void* img, CvPoint pt1, CvPoint pt2, void* _buffer, int connectivity ) { int count = -1; int i, coi = 0, pix_size; CvMat stub, *mat = cvGetMat( img, &stub, &coi ); CvLineIterator iterator; uchar* buffer = (uchar*)_buffer; if( coi != 0 ) CV_Error( CV_BadCOI, "" ); if( !buffer ) CV_Error( CV_StsNullPtr, "" ); count = cvInitLineIterator( mat, pt1, pt2, &iterator, connectivity ); pix_size = CV_ELEM_SIZE(mat->type); for( i = 0; i < count; i++ ) { for( int j = 0; j < pix_size; j++ ) buffer[j] = iterator.ptr[j]; buffer += pix_size; CV_NEXT_LINE_POINT( iterator ); } return count; }
// Return the image points that are at the line segment CvPoint *image_utils_get_line_points(IplImage *img, CvPoint A, CvPoint B, int *n_points) { int i; CvLineIterator iterator; *n_points = cvInitLineIterator(img, A, B, &iterator, 8, 0); CvPoint* line_points = (CvPoint*)malloc((*n_points) * sizeof(CvPoint)); for(i = 0; i < *n_points; i++) { void *p_0 = &img->imageData[0];//get the memory address of the image data void *p_c = &iterator.ptr[0];//get the memory address of the current point at the line segment // computes the memory offset (in bytes) between image data and current point at the line segment int offset = (char *)p_c - (char *)p_0; // since 'offset = y * widthStep + x * nChannels', compute the current point at the line segment line_points[i].x = (offset % img->widthStep) / img->nChannels; line_points[i].y = offset / img->widthStep; CV_NEXT_LINE_POINT(iterator); } return line_points; }
CV_IMPL int cvSampleLine( const void* img, CvPoint pt1, CvPoint pt2, void* _buffer, int connectivity ) { int count = -1; CV_FUNCNAME( "cvSampleLine" ); __BEGIN__; int i, coi = 0, pix_size; CvMat stub, *mat = (CvMat*)img; CvLineIterator iterator; uchar* buffer = (uchar*)_buffer; CV_CALL( mat = cvGetMat( mat, &stub, &coi )); if( coi != 0 ) CV_ERROR( CV_BadCOI, "" ); if( !buffer ) CV_ERROR( CV_StsNullPtr, "" ); CV_CALL( count = cvInitLineIterator( mat, pt1, pt2, &iterator, connectivity )); pix_size = CV_ELEM_SIZE(mat->type); for( i = 0; i < count; i++ ) { CV_MEMCPY_AUTO( buffer, iterator.ptr, pix_size ); buffer += pix_size; CV_NEXT_LINE_POINT( iterator ); } __END__; return count; }
static CvStatus icvPostWarpImage8uC3R( int numLines, /* number of scanlines */ uchar * src, /* source buffers */ int *src_nums, /* lens of buffers */ uchar * dst, /* dest image */ int dst_step, /* dest image step */ CvSize dst_size, /* dest image size */ int *scanlines ) /* scanline */ { int i, k; CvPoint start; CvPoint end; int curr; int src_num; int curr_src; CvMat mat; CvLineIterator iterator; curr = 0; curr_src = 0; cvInitMatHeader( &mat, dst_size.height, dst_size.width, CV_8UC3, dst, dst_step ); for( k = 0; k < numLines; k++ ) { start.x = scanlines[curr++]; start.y = scanlines[curr++]; end.x = scanlines[curr++]; end.y = scanlines[curr++]; src_num = src_nums[k]; if( cvInitLineIterator( &mat, start, end, &iterator, 8 ) != src_num ) { assert(0); return CV_NOTDEFINED_ERR; } for( i = 0; i < src_num; i++ ) { memcpy( iterator.ptr, src + curr_src, 3 ); CV_NEXT_LINE_POINT( iterator ); curr_src += 3; } #if 0 err = icvDrawLine8uC3R( src + curr_src, /* sourse buffer */ src_num, /* len of buffer */ dst, /* dest image */ dst_step, /* dest image step */ dst_size, /* dest image size */ start, /* start point */ end ); /* end point */ curr_src += src_num * 3; #endif } return CV_NO_ERR; }