C ++如何创建简单的2d区域松鸡算法?

时间:2011-02-11 19:00:22

标签: c++ boost opencv region

我们有一些2d数据解析器可以重现大小为8x8(roiSize = 8)的图像,这些图像从以下内容发送到我们的解析器:

void UseOurParser(IplImage* destination)
{
    int w = destination->width;
    int h = destination->height;

    original = cvCreateImage(cvSize(w, h),IPL_DEPTH_8U,1);
    cvCvtColor(destination,original,CV_RGB2GRAY);

    cout << endl << "Progress:";
    for(int j = 1; j < original->width/roiSize-1; j=j++) {
        cout << "." ;
        for(int i = 1; i < original->height/roiSize-1; i=i++) {    
            cvSetImageROI(original, cvRect(j*roiSize, i*roiSize,roiSize, roiSize));
            IplImage *cropSource = cvCreateImage(cvGetSize(original), original->depth, original->nChannels);
            cvCopy(original, cropSource, NULL);
            ProcessOurParser(cropSource, j, i);
            cvResetImageROI(original);
        }
    } //...

我们的解析器采用图像j,i,在其内部可以确定是否在图像上找到了对象。如果发现它执行另一个操作,确定一些特征值(一些浮动)。我想以某种方式创建我的数据的二维表示(大小像(original-&gt; width / roiSize-2)X(original-&gt; height / roiSize-2))所以每个roi我都有一个值声明如果在其中找到了特征,那么它是否是它的特征值。我需要的是能够迭代生成的数据。并且实现某种区域松鸡算法,这样如果一个roi上的特征是==以另一个是8个周围的特征,我们会以某种方式增长区域并反复检查以便我们找到区域......

因此,如果我们正在搜索线条,并且我们的特征是线条存在和角度浮动的bool(就像我一样),我们会做类似的事情

1)(我们站在蓝色1和2黄色1是我们感兴趣的点)

enter image description here

我们提到2个地区的“线路”并继续搜索

enter image description here

我们发现一个roi上的帽子特征与我们的线路有关,而另一个不是这样我们将在稍后返回那个roi

enter image description here

那么对于如何做这样的事情或者你能提供的任何代码帮助有什么帮助呢?

1 个答案:

答案 0 :(得分:1)

我没有花时间观察Grouse算法,但我猜你可以使用STL容器(向量,散列等)和自定义类的组合为你的结构(图像,rois,地区,等等。)

例如:

  • imageRoiHash(key=rowIndex, value=roi)imageRoiHash(key=rowIndex, value=vector<roi>)。我不知道你的每个图像行是否可以有一个或多个rois。
  • A roiClass(bool found, TValue value)TValue是一个int,一个字符串或另一个类。 然后,您可以处理您的图像,并使用hash [rowIndex]获取每行中的rois。

或者:

  • imageRoiList(std::vector<roi>)imageRoiList(std::vector<std::vector<roi>)。这是一个2D结构,您可以在每个图像行保留roi或rois。