64位系统的fcvDrawContouru8问题

时间:2015-11-27 05:02:55

标签: c++ computer-vision

我正在使用fastcv v1.7开发图像处理算法,该过程的一部分包括从图像中查找轮廓,在它们中选择几个轮廓,然后仅绘制这些轮廓。

此代码块在32位系统中平稳运行,产生预期输出,但在64位系统上,同一代码在执行fcvDrawContouru8的循环期间意外崩溃。崩溃是意外的,因为有时循环迭代2或3次,有时在第一次迭代时崩溃。如果问题是64位内存分配或fastcv本身,似乎无法解决问题。任何建议都会有所帮助。

    uint8_t* dist_fcv = (uint8_t*)fcvMemAlloc(dist_8u.cols*dist_8u.rows*OPT_CV_ELEM_SIZE(OPT_CV_8UC1), FCV_ALIGN);
    memset(dist_fcv, 0, dist_8u.cols*dist_8u.rows*OPT_CV_ELEM_SIZE(OPT_CV_8UC1));

    uint32_t maxNumContours = MAX_CNT;
    uint32_t sizeOfpBuffer = 0;
    uint32_t maxPoints= ((2*dist_8u.cols) + (2 * dist_8u.rows));
    uint32_t  pNumContours = 0;
    uint32_t pNumContourPoints[MAX_CNT] = {0};
    uint32_t** pContourStartPointsfind = (uint32_t**)fcvMemAlloc(MAX_CNT*2*sizeof(uint32_t*),16);
    sizeOfpBuffer = (MAX_CNT * 2 * maxPoints * sizeof(uint32_t));
    uint32_t *pPointBuffer=(uint32_t *)malloc(sizeOfpBuffer);
    memset(pPointBuffer,0,sizeOfpBuffer);
    int32_t hierarchy[MAX_CNT][4];
    void* cHandle = fcvFindContoursAllocate(dist_8u.cols);

    fcvFindContoursExternalu8(textureless.data.ptr,
            dist_8u.cols,
            dist_8u.rows,
            dist_8u.cols,
            maxNumContours,
            &pNumContours,
            pNumContourPoints,
            pContourStartPointsfind,
            pPointBuffer,
            sizeOfpBuffer,
            hierarchy,
            cHandle);

    size_t n_TL = 0;

    uint32_t** pContourStartPointsdraw = (uint32_t**)fcvMemAlloc(MAX_CNT*2*sizeof(uint32_t*),16);
    uint32_t pNumDrawContourPoints[MAX_CNT] = {0};
    uint32_t* dPointBuffer=(uint32_t *)malloc(sizeOfpBuffer);
    uint32_t* start_contour = pPointBuffer;
    uint32_t* start_contour_dPoint = dPointBuffer;

    uint32_t** startFind_ptr = pContourStartPointsfind;
    uint32_t** draw_ptr = pContourStartPointsdraw;

    for (size_t i = 0; i < pNumContours; i++,startFind_ptr++)
    {

        int points_per_contour = pNumContourPoints[i];
        double area = polyArea(start_contour,points_per_contour*2);

        if(area < min_textureless_area)
        {
            start_contour = start_contour + points_per_contour*2;
            continue;
        }

        *(draw_ptr) = *(startFind_ptr);
        pNumDrawContourPoints[n_TL] = pNumContourPoints[i];
        memcpy(start_contour_dPoint,start_contour,points_per_contour*2*sizeof(uint32_t));
        start_contour_dPoint = start_contour_dPoint + points_per_contour*2;
        start_contour = start_contour + points_per_contour*2;
        n_TL++;
        draw_ptr++;


    }

    uint32_t* holeflag = (uint32_t*)malloc(pNumContours*sizeof(uint32_t));
    memset(holeflag,0,pNumContours*sizeof(uint32_t));
    uint32_t bufferSize = 0;

    start_contour_dPoint = dPointBuffer;

    draw_ptr = pContourStartPointsdraw;

    for(int i = 0; i < n_TL; i++)
    {
        int points_per_contour = pNumDrawContourPoints[i];
        bufferSize = points_per_contour*2*sizeof(uint32_t);

            fcvDrawContouru8(dist_fcv,
                        dist_8u.cols,
                        dist_8u.rows,
                        dist_8u.cols,
                        1,
                        holeflag,
                        &pNumDrawContourPoints[i],
                        (const uint32_t ** __restrict)(draw_ptr),
                        bufferSize,
                        start_contour_dPoint,
                        hierarchy,
                        1,1,i+1,0)

        start_contour_dPoint = start_contour_dPoint + points_per_contour*2;
        draw_ptr++;


    }

    free(pPointBuffer);
    fcvFindContoursDelete(cHandle);
    fcvMemFree(pContourStartPointsfind);

0 个答案:

没有答案