比较set_intersection(常用元素)的大小和方向使用?

时间:2015-12-14 18:23:54

标签: c++ opencv

我试图比较16幅图像(N = 4,M = 4)的幅度和方向,并检查它们之间的连续性。

所以,我将图像0与图像1,图像2 ...图像15进行比较。

然后,图像1,图像2,图像3 ..图像15。

每张图片的尺寸均为200x200和CV_32F类型。

我有一个:

vector<Mat> smallImages;
smallImages.reserve( N * M ); //( N = 4 , M  = 4 )

我计算了渐变:

    vector<Mat> grad_x;
    vector<Mat> grad_y;
    grad_x.resize( N*M );
    grad_y.resize( N*M );

    // gradients x and y 
    for ( int idx = 0; idx < N*M; idx++ )
    {
        Sobel( smallImages[ idx ], grad_x[ idx ], ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT );
        Sobel( smallImages[ idx ], grad_y[ idx ], ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT );
    }

然后,大小和方向:

    // magnitude and direction
    vector<Mat> magnitude;
    vector<Mat> direction;
    magnitude.resize( N*M );
    direction.resize( N*M );

    for ( int idx = 0; idx < N*M; idx++ )
    {
        cartToPolar( grad_x[ idx ], grad_y[ idx ], magnitude[ idx ], direction[ idx ] );
    }

然后,我试图比较(例如像[this]这样的量级)1

    vector<Mat> MagnitudeComp;
    MagnitudeComp.resize( N*M * N*M );

    std::vector<cv::Mat>::iterator it;
    std::sort( magnitude.begin(), magnitude.end() );


    it = std::set_intersection( magnitude.begin(), magnitude.end(),    direction.begin(), direction.end(), MagnitudeComp.begin() );
    MagnitudeComp.resize( it - MagnitudeComp.begin() );   

我不确定为什么std :: sort不起作用(很多错误如:)

/usr/include/c++/5.2.0/bits/predefined_ops.h:71:25: error: cannot convert ‘cv::MatExpr’ to ‘bool’ in return
       { return __val < *__it; }

我不知道是否有更好的方法来获得我想要的东西(一个用于保持幅度和方向差异的矩阵)。

我知道我能做到:

cv :: sort(幅度,幅度,CV_SORT_EVERY_ROW + CV_SORT_ASCENDING);

但我不确定我是否可以执行std::set_intersection

1 个答案:

答案 0 :(得分:0)

std::sort()不起作用的原因是默认情况下它使用operator <()作为值类型,在您的情况下是矩阵。由于comparing两个矩阵导致第三个矩阵作为输出,因此不能将其用作排序的谓词。

所以你需要一个谓词来命令你的矩阵(用说法中的“严格弱排序”)。我想问题就是回到你身边:你如何定义系统中矩阵的排序?完成后,您需要实现这样的谓词:

bool matrixOrder(const Mat& m1, const Mat& m2);

并像这样使用它:

sort(magnitude.begin(), magnitude.end(), matrixOrder);