Пример #1
0
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;
}
Пример #2
0
// 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;
}
Пример #3
0
static CvStatus
icvPreWarpImage8uC3R( int numLines,     /* number of scanlines   */
                      uchar * src,      /* source image          */
                      int src_step,     /* line step         */
                      uchar * dst,      /* dest buffers          */
                      int *dst_nums,    /* lens of buffer        */
                      CvSize src_size,  /* image size in pixels */
                      int *scanlines )  /* scanlines array       */
{
    int k;
    CvPoint start;
    CvPoint end;
    int curr;
    int curr_dst;
    CvMat mat;

    curr = 0;
    curr_dst = 0;

    cvInitMatHeader( &mat, src_size.height, src_size.width, CV_8UC3, src, src_step );

    for( k = 0; k < numLines; k++ )
    {
        start.x = scanlines[curr++];
        start.y = scanlines[curr++];

        end.x = scanlines[curr++];
        end.y = scanlines[curr++];

#ifdef _DEBUG
        {
        CvLineIterator iterator;
        assert( cvInitLineIterator( &mat, start, end, &iterator, 8 ) == dst_nums[k] );
        }
#endif
        cvSampleLine( &mat, start, end, dst + curr_dst, 8 );
        curr_dst += dst_nums[k] * 3;

    }

    return CV_NO_ERR;
}
Пример #4
0
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;
}
Пример #5
0
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;

}