OpenCV 3.0打印垫

时间:2015-01-11 19:13:22

标签: opencv histogram

我是OpenCV的新手,所以请耐心等待..我正在尝试为给定图像转储直方图Mat对象..它失败并出现以下错误 - 任何帮助表示赞赏......

下面程序中的第一个cout,即加载的图像成功打印 - 而图像hist的第二个cout失败并出现以下错误

OpenCV Error: Assertion failed (m.dims <= 2) in FormattedImpl, file /mycode/ws/opencv/opencv-3.0.0-beta/modules/core/src/out.cpp, line 86
libc++abi.dylib: terminating with uncaught exception of type cv::Exception: /mycode/ws/opencv/opencv-3.0.0-beta/modules/core/src/out.cpp:86: error: (-215) m.dims <= 2 in function FormattedImpl

这是完整的代码

#include <stdio.h>
#include <string>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(int argc, char** argv) {
    if (argc != 2) {
        printf("usage: opencv.out <Image_Path>\n");
        return -1;
    }

    string imagePath = (argv[1]);

    cout << "loading image..." << imagePath << endl;

    Mat image = imread(imagePath, 1);

    Mat hist;

    int imgCount = 1;
    int dims = 3;
    const int histSizes[] = {4, 4, 4};
    const int channels[] = {0, 1, 2};
    float rRange[] = {0, 256};
    float gRange[] = {0, 256};
    float bRange[] = {0, 256};
    const float *ranges[] = {rRange, gRange, bRange};
    Mat mask = Mat();

    calcHist(&image, imgCount, channels, mask, hist, dims, histSizes, ranges);

    cout << image << "Loaded image..." << endl;
    cout << "Hist of image..." << hist;
    return 0;
}

1 个答案:

答案 0 :(得分:0)

基于OpenCV 2.4.9源代码:

static inline std::ostream& operator << (std::ostream& out, const Mat& mtx)
{
    Formatter::get()->write(out, mtx);
    return out;
}

使用<<运算符时您正在调用的函数。 Formatter::get()返回适当的内容 格式化程序类基于您正在使用的编程语言。

write()函数基本上调用:

static void writeMat(std::ostream& out, const Mat& m, char rowsep, char elembrace, bool singleLine)
{
    CV_Assert(m.dims <= 2);
    int type = m.type();

    char crowbrace = getCloseBrace(rowsep);
    char orowbrace = crowbrace ? rowsep : '\0';

    if( orowbrace || isspace(rowsep) )
        rowsep = '\0';

    for( int i = 0; i < m.rows; i++ )
    {
        if(orowbrace)
            out << orowbrace;
        if( m.data )
            writeElems(out, m.ptr(i), m.cols, type, elembrace);
        if(orowbrace)
            out << crowbrace << (i+1 < m.rows ? ", " : "");
        if(i+1 < m.rows)
        {
            if(rowsep)
                out << rowsep << (singleLine ? " " : "");
            if(!singleLine)
                out << "\n  ";
        }
    }
}

正如您所看到的,Mat维度是否大于2,将在您的代码(CV_Assert(m.dims<=2))中抛出断言。

带有您提供的参数的

calcHist()会生成3维Mat,因此无法使用<<运算符显示

以这种方式调用calcHist()函数,你得到了三维直方图,我没有看到一个简单的解决方案,可以在OpenCV中看到它(这并不意味着它可以&#t; t完成)。如果您必须这样做,我建议您考虑使用OpenGL进行3D数据可视化。如果没有,你可以单独为每个通道单独调用此函数 - 你将获得3个一维直方图,你可以使用<<运算符进行打印。