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

标签 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

最佳答案

  • 您可以直接调用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 扩展非常有用。

关于c++ - 复制排序矩阵的一行并保存到文件 - opencv3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32175146/

相关文章:

python - 防止 OpenCV 函数 CreateVideoWriter 在 Python 中打印到控制台

c++ - opencv 图像重新缩放错误的偏移量

java - 加密程序

c++ - 如何开始在 Win32 上使用 Winforms 风格的应用程序?

Powershell 排序哈希表

java - 按编号对列表排序

c++ - 将直接值传递给 CreateIoCompletionPort() 的 CompletionKey 参数

algorithm - n 个不同整数的数组中 k 个最小整数的就地排序算法

opencv - 使用 OpenCV 为 Tesseract OCR 预处理图像

opencv - 从vector <IplImage *>转换为vector <Mat>