此问题不是this question
的副本我想对整个Mat image
进行排序并存储类似于MatLab's [B , Ix] = sort(A);
的索引
但在openCV中,sort()和sortIdx()仅适用于EACH_ROW
或EACH_COLUMN
。
问题:那么,我如何对整个Mat
进行排序并将Indices
也存储在openCV中?
PS:我想获得以下内容:
INPUT =
2 0
4 1
dst_index =
1 1
2 2
dst_sorted =
0 1
2 4
答案 0 :(得分:2)
有一个解决方案,但只有图像在内存中连续时才有效。除非您的图像仅是更大图像的ROI,否则通常会出现这种情况。您可以使用函数isContinuous进行检查。诀窍是创建使用与原始图像相同的内存缓冲区的Mat,但不将其视为N行和M列,而是将其视为1行和M * N列。这可以通过reshape函数完成。
Mat sameMemoryNewShape = image.reshape(1, 1);
现在可以在sameMemoryNewShape上使用sort()或sortIdx()。
答案 1 :(得分:0)
根据'Michael Burdinov'的解决方案,以下内容应该有效。
Mat A = (Mat_<uchar>(3, 4) << 0, 5, 2, 5, 2, 4, 9, 12, 3, 12, 11, 1); // example matrix
Mat B; //storing the 1D index result
Mat C = A.reshape(1, 1); //as mentioned by Michael Burdinov
sortIdx(C, B, SORT_EVERY_ROW + SORT_ASCENDING);
for (int i = 0; i < B.cols; i++) //from index 0 to index rows * cols of the original image
{
int val = B.at<int>(0, i); //access B, which is in format CV_32SC1
int y = val / A.cols; //convert 1D index into 2D index
int x = val % A.cols;
std::cout << "idx " << val << " at (x/y) " << x << "/" << y
<< " is " << (int) A.at<uchar>(y, x) << endl;
}
请注意,结果B
位于CV_32SC1(32位整数)中。不考虑这可能会导致“奇怪”的行为,并可能导致1 0 0 0
。