{
class FormattedImpl : public cv::Formatted
{
- enum { STATE_PROLOGUE, STATE_EPILOGUE, STATE_ROW_OPEN, STATE_ROW_CLOSE, STATE_CN_OPEN, STATE_CN_CLOSE, STATE_VALUE, STATE_FINISHED,
+ enum { STATE_PROLOGUE, STATE_EPILOGUE, STATE_INTERLUDE,
+ STATE_ROW_OPEN, STATE_ROW_CLOSE, STATE_CN_OPEN, STATE_CN_CLOSE, STATE_VALUE, STATE_FINISHED,
STATE_LINE_SEPARATOR, STATE_CN_SEPARATOR, STATE_VALUE_SEPARATOR };
enum {BRACE_ROW_OPEN = 0, BRACE_ROW_CLOSE = 1, BRACE_ROW_SEP=2, BRACE_CN_OPEN=3, BRACE_CN_CLOSE=4 };
cv::Mat mtx;
int mcn; // == mtx.channels()
bool singleLine;
+ bool alignOrder; // true when cn first order
int state;
int row;
public:
- FormattedImpl(cv::String pl, cv::String el, cv::Mat m, char br[5], bool sLine, int precision)
+ FormattedImpl(cv::String pl, cv::String el, cv::Mat m, char br[5], bool sLine, bool aOrder, int precision)
{
+ CV_Assert(m.dims <= 2);
+
prologue = pl;
epilogue = el;
mtx = m;
memcpy(braces, br, 5);
state = STATE_PROLOGUE;
singleLine = sLine;
+ alignOrder = aOrder;
+ row = col = cn =0;
if (precision < 0)
{
row = 0;
if (mtx.empty())
state = STATE_EPILOGUE;
+ else if (alignOrder)
+ state = STATE_INTERLUDE;
else
state = STATE_ROW_OPEN;
return prologue.c_str();
+ case STATE_INTERLUDE:
+ state = STATE_ROW_OPEN;
+ if (row >= mtx.rows)
+ {
+ if (++cn >= mcn)
+ {
+ state = STATE_EPILOGUE;
+ buf[0] = 0;
+ return buf;
+ }
+ else
+ row = 0;
+ sprintf(buf, "\n(:, :, %d) = \n", cn+1);
+ return buf;
+ }
+ sprintf(buf, "(:, :, %d) = \n", cn+1);
+ return buf;
case STATE_EPILOGUE:
state = STATE_FINISHED;
return epilogue.c_str();
}
return next();
case STATE_CN_OPEN:
- cn = 0;
state = STATE_VALUE;
+ if (!alignOrder)
+ cn = 0;
if (mcn > 1 && braces[BRACE_CN_OPEN])
{
buf[0] = braces[BRACE_CN_OPEN];
return next();
case STATE_VALUE:
(this->*valueToStr)();
- if (++cn >= mcn)
- state = STATE_CN_CLOSE;
- else
+ state = STATE_CN_CLOSE;
+ if (alignOrder)
+ return buf;
+ if (++cn < mcn)
state = STATE_VALUE_SEPARATOR;
return buf;
case STATE_FINISHED:
case STATE_LINE_SEPARATOR:
if (row >= mtx.rows)
{
- state = STATE_EPILOGUE;
+ if (alignOrder)
+ state = STATE_INTERLUDE;
+ else
+ state = STATE_EPILOGUE;
return next();
}
state = STATE_ROW_OPEN;
int prec64f;
int multiline;
};
+ class DefaultFormatter : public FormatterBase
+ {
+ public:
+
+ cv::Ptr<cv::Formatted> format(const cv::Mat& mtx) const
+ {
+ char braces[5] = {'\0', '\0', ';', '\0', '\0'};
+ return cv::makePtr<FormattedImpl>("[", "]", mtx, &*braces,
+ mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
+ }
+ };
class MatlabFormatter : public FormatterBase
{
cv::Ptr<cv::Formatted> format(const cv::Mat& mtx) const
{
char braces[5] = {'\0', '\0', ';', '\0', '\0'};
- return cv::makePtr<FormattedImpl>("[", "]", mtx, &*braces,
- mtx.rows == 1 || !multiline, mtx.depth() == CV_64F ? prec64f : prec32f );
+ return cv::makePtr<FormattedImpl>("", "", mtx, &*braces,
+ mtx.rows == 1 || !multiline, true, mtx.depth() == CV_64F ? prec64f : prec32f );
}
};
if (mtx.cols == 1)
braces[0] = braces[1] = '\0';
return cv::makePtr<FormattedImpl>("[", "]", mtx, &*braces,
- mtx.rows*mtx.channels() == 1 || !multiline, mtx.depth() == CV_64F ? prec64f : prec32f );
+ mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
}
};
braces[0] = braces[1] = '\0';
return cv::makePtr<FormattedImpl>("array([",
cv::format("], type='%s')", numpyTypes[mtx.depth()]), mtx, &*braces,
- mtx.rows*mtx.channels() == 1 || !multiline, mtx.depth() == CV_64F ? prec64f : prec32f );
+ mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
}
};
char braces[5] = {'\0', '\0', '\0', '\0', '\0'};
return cv::makePtr<FormattedImpl>(cv::String(),
mtx.rows > 1 ? cv::String("\n") : cv::String(), mtx, &*braces,
- mtx.rows*mtx.channels() == 1 || !multiline, mtx.depth() == CV_64F ? prec64f : prec32f );
+ mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
}
};
{
char braces[5] = {'\0', '\0', ',', '\0', '\0'};
return cv::makePtr<FormattedImpl>("{", "}", mtx, &*braces,
- mtx.rows == 1 || !multiline, mtx.depth() == CV_64F ? prec64f : prec32f );
+ mtx.rows == 1 || !multiline, false, mtx.depth() == CV_64F ? prec64f : prec32f );
}
};
{
switch(fmt)
{
+ case FMT_DEFAULT:
+ return makePtr<DefaultFormatter>();
case FMT_MATLAB:
return makePtr<MatlabFormatter>();
case FMT_CSV:
case FMT_C:
return makePtr<CFormatter>();
}
- return makePtr<MatlabFormatter>();
+ return makePtr<DefaultFormatter>();
}
} // cv