如何有效地将两个重叠轮廓合并为一个大轮廓?

时间:2014-07-17 11:56:05

标签: opencv

我有一个巨大的图像(约63000 x 63000像素= 3969百万像素) 到目前为止我所做的是我决定制作" tiles" (1024 x 1024)并根据这些图块进行计算,得到一个62 x 62图像平铺网格! (效果非常好,并且具有通过放大和缩小使图像可见的优点,例如只有缩小视图的瓷砖尺寸) 但我现在需要的是巨大图像的轮廓!

  • 我使用OpenCV功能" findContours"检测每个轮廓 其中一块瓷砖。
  • 我在瓷砖上添加了一些重叠,所以我得到了 重叠轮廓(1像素重叠)
  • 我使用了offset参数 " findContours"将轮廓移动到正确的位置
    进入"虚拟总图像"

以下是我从演示应用程序制作的一些截图 enter image description here enter image description here enter image description here

我想要的是: enter image description here

现在我的问题:

  1. 是否可以缝合轮廓,我最糟糕的情况是覆盖整个图像的轮廓...是否有一些库可以做到这一点?
  2. 是否有一个库可以处理整个图像的压缩版本(例如rle)
  3. 有没有办法让opencv findcontours在1位二进制映像上工作?
  4. 这是findcontours使用的代码:

        // Surf2DTiledData ...a gobject based class used for 2d tile management and viewing.. 
    Surf2DTiledData* td = (Surf2DTiledData*)in_td;
    
    int nr_hor_tiles = surf2_d_tiled_data_get_nr_hor_tiles(td);
    int nr_ver_tiles = surf2_d_tiled_data_get_nr_ver_tiles(td);
    int tile_size_x = surf2_d_tiled_data_get_tile_width(td);
    int tile_size_y = surf2_d_tiled_data_get_tile_height(td);
    
    contouring_data_obj = surf2_d_tiled_data_get_ContouringData(td);
    p_contours = contouring_data_obj->p_contours;
    p_border_contours = contouring_data_obj->p_border_contours;
    
    g_return_if_fail(p_border_contours != NULL);
    g_return_if_fail(p_contours != NULL);
    
    
    for (y = 0; y < nr_ver_tiles; y++){
        int x;
        for (x = 0; x < nr_hor_tiles; x++){
            int idx = x + y*nr_hor_tiles;
            CvMemStorage *mem = contouring_data_obj->contour_storage[idx];
            CvMat _src;
            CvSeq *contours = NULL;
            uchar* dataBuffer = (uchar*)p_data[x][y];
    
            // the idea is to have some extra space available for the overlap
            // detection of contours!
            // the extra space is needed for the algorithm to check for
            // overlaps of contours later on!
    #define VIRT_BORDER_EXTEND 2
            int virtual_x = x * tile_size_x - VIRT_BORDER_EXTEND;
            int virtual_y = y * tile_size_y - VIRT_BORDER_EXTEND;
    
            int virtual_width = tile_size_x + VIRT_BORDER_EXTEND * 2;
            int virtual_height = tile_size_y + VIRT_BORDER_EXTEND * 2;
            int x_off = -VIRT_BORDER_EXTEND;
            int y_off = -VIRT_BORDER_EXTEND;
            if (virtual_x < 0) {
                virtual_width += virtual_x;
                virtual_x = 0;
                x_off = 0;
            }
    
            if (virtual_y < 0) {
                virtual_height += virtual_y;
                virtual_y = 0;
                y_off = 0;
            }
    
            if ((virtual_x + virtual_width) > (nr_hor_tiles*tile_size_x)) {
                virtual_width = nr_hor_tiles*tile_size_x - virtual_x;
            }
    
            if ((virtual_y + virtual_height) > (nr_ver_tiles*tile_size_y)) {
                virtual_height = nr_ver_tiles*tile_size_y - virtual_y;
            }
    
            CvMat* _roi_mat = get_roi_mat(td,
                               virtual_x, virtual_y,
                               virtual_width, virtual_height);
    
            // Use either this:
            //mem = cvCreateMemStorage(0);
    
            if (_roi_mat){
                // CV_LINK_RUNS => different algorithm!!!!
                int tile_off_x = tile_size_x * x;
                int tile_off_y = tile_size_y * y;
    
                CvPoint contour_shift = cvPoint(x_off + tile_off_x, y_off + tile_off_y);
    
                int n = cvFindContours(_roi_mat, mem, &contours, sizeof(CvContour), CV_RETR_LIST, CV_CHAIN_APPROX_SIMPLE, contour_shift);
    
                cvReleaseMat(&_roi_mat);
    
                p_contours[x][y] = contours;
            }
    
            //cvReleaseMemStorage(&mem);
        }
    }
    

    后来我用opengl从瓷砖中制作纹理,每个瓷砖都有一个四边形! opencv轮廓没有绘制,因为现在这可能太慢了,但是我绘制了它们的边界框...它们也是用opengl绘制的。

0 个答案:

没有答案