OpenCV 3.0 打印垫
OpenCV 3.0 printing Mat
我是 OpenCV 的新手,所以请耐心等待。我正在尝试转储给定图像的直方图 Mat 对象。它失败并出现以下错误 - 感谢您的帮助...
下面程序中的第一个 cout,即加载图像的第一个 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;
}
基于 OpenCV 2.4.9 源代码:
static inline std::ostream& operator << (std::ostream& out, const Mat& mtx)
{
Formatter::get()->write(out, mtx);
return out;
}
是您在使用 <<
运算符时调用的函数。 Formatter::get()
returns 合适
格式化程序 class 基于您使用的编程语言。
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 : '[=11=]';
if( orowbrace || isspace(rowsep) )
rowsep = '[=11=]';
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
,因此无法使用 <<
operator
显示
通过调用 calcHist()
函数,您将获得 3 维直方图,但我没有看到在 OpenCV 中将其可视化的简单解决方案(这并不意味着无法完成)。如果这是您必须做的事情,我建议您研究 OpenGL 的 3D 数据可视化。如果不是,您可以简单地为每个通道单独调用此函数 - 您将获得 3 个一维直方图,您可以使用 <<
运算符打印这些直方图。
我是 OpenCV 的新手,所以请耐心等待。我正在尝试转储给定图像的直方图 Mat 对象。它失败并出现以下错误 - 感谢您的帮助...
下面程序中的第一个 cout,即加载图像的第一个 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;
}
基于 OpenCV 2.4.9 源代码:
static inline std::ostream& operator << (std::ostream& out, const Mat& mtx)
{
Formatter::get()->write(out, mtx);
return out;
}
是您在使用 <<
运算符时调用的函数。 Formatter::get()
returns 合适
格式化程序 class 基于您使用的编程语言。
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 : '[=11=]';
if( orowbrace || isspace(rowsep) )
rowsep = '[=11=]';
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
,因此无法使用 <<
operator
通过调用 calcHist()
函数,您将获得 3 维直方图,但我没有看到在 OpenCV 中将其可视化的简单解决方案(这并不意味着无法完成)。如果这是您必须做的事情,我建议您研究 OpenGL 的 3D 数据可视化。如果不是,您可以简单地为每个通道单独调用此函数 - 您将获得 3 个一维直方图,您可以使用 <<
运算符打印这些直方图。