复制已排序矩阵的一行并保存到文件 - opencv3

时间:2015-08-24 05:45:24

标签: c++ sorting opencv

我一直在努力想出我的代码出了什么问题。我试图对矩阵进行排序,然后复制排序矩阵的最后一行。我无法在调试器(vs2015 / vc ++)中查看内容,所以我需要将内容保存到磁盘,但我一直收到错误"没有给出元素名称"我怀疑是排序矩阵的最后一行的错误复制操作的结果。

            cv::Mat sortedIndices;
            cv::sortIdx(Matrix, sortedIndices, CV_SORT_EVERY_COLUMN + CV_SORT_ASCENDING);
            cv::sort(Matrix, Matrix, CV_SORT_EVERY_COLUMN + CV_SORT_ASCENDING);
            auto cols = Matrix.size().width-1;
            auto maximums = Mat::zeros(1,cols+1,Matrix.type());
            Mat onlyRow = maximums.row(0);
            Matrix.row(Matrix.size().height - 1).copyTo(onlyRow);
            cv::FileStorage file("G:/3.txt", cv::FileStorage::WRITE);
            file << maximums;

我希望这很简单! enter image description here

1 个答案:

答案 0 :(得分:1)

  • 您可以直接调用sort对矩阵进行排序,之前不需要sortIdx
  • 您可以使用Range方便地获取子矩阵(例如单行)。
  • 使用FileStorage保存内容时,您应指定名称

以下示例应澄清:

#include <opencv2\opencv.hpp>
#include <vector>
using namespace std;
using namespace cv;

int main()
{
    RNG rng(1234);

    // Create a small random matrix
    Mat1b mat(3,5);
    randu(mat, Scalar(0), Scalar(255));

    // Sort the columns in ascending order
    cv::sort(mat, mat, SORT_EVERY_COLUMN + SORT_ASCENDING);

    // Just creating the header to last row
    // No actual data copy
    Mat1b lastCol(mat, Range(mat.rows - 1, mat.rows), Range::all());    

    {
        // Write last row to file
        FileStorage fout("test.yml", FileStorage::WRITE);
        fout << "some_name" << lastCol;
    }

    Mat1b lastCol2;
    {
        // Read last row from file
        FileStorage fin("test.yml", FileStorage::READ);
        fin["some_name"] >> lastCol2;
    }

    // lastCol and lastCol2 contain the same values now.

    return 0;
}

由于您提到需要转储数据以进行调试,请参阅this问题。 简而言之,您会发现Image Watch Visual Studio扩展非常有用。