我试图比较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
。
答案 0 :(得分:0)
std::sort()
不起作用的原因是默认情况下它使用operator <()
作为值类型,在您的情况下是矩阵。由于comparing两个矩阵导致第三个矩阵作为输出,因此不能将其用作排序的谓词。
所以你需要一个谓词来命令你的矩阵(用说法中的“严格弱排序”)。我想问题就是回到你身边:你如何定义系统中矩阵的排序?完成后,您需要实现这样的谓词:
bool matrixOrder(const Mat& m1, const Mat& m2);
并像这样使用它:
sort(magnitude.begin(), magnitude.end(), matrixOrder);