mirror of
https://github.com/opencv/opencv.git
synced 2025-06-07 17:44:04 +08:00
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
This commit is contained in:
commit
d4a17da7b2
@ -104,14 +104,16 @@ struct LogTagAuto
|
|||||||
// non-null. Do not re-define.
|
// non-null. Do not re-define.
|
||||||
#define CV_LOGTAG_GLOBAL cv::utils::logging::internal::getGlobalLogTag()
|
#define CV_LOGTAG_GLOBAL cv::utils::logging::internal::getGlobalLogTag()
|
||||||
|
|
||||||
#define CV_LOG_WITH_TAG(tag, msgLevel, ...) \
|
#define CV_LOG_WITH_TAG(tag, msgLevel, extra_check0, extra_check1, ...) \
|
||||||
for(;;) { \
|
for(;;) { \
|
||||||
|
extra_check0; \
|
||||||
const auto cv_temp_msglevel = (cv::utils::logging::LogLevel)(msgLevel); \
|
const auto cv_temp_msglevel = (cv::utils::logging::LogLevel)(msgLevel); \
|
||||||
if (cv_temp_msglevel >= (CV_LOG_STRIP_LEVEL)) break; \
|
if (cv_temp_msglevel >= (CV_LOG_STRIP_LEVEL)) break; \
|
||||||
auto cv_temp_logtagptr = CV_LOGTAG_PTR_CAST(CV_LOGTAG_EXPAND_NAME(tag)); \
|
auto cv_temp_logtagptr = CV_LOGTAG_PTR_CAST(CV_LOGTAG_EXPAND_NAME(tag)); \
|
||||||
if (!cv_temp_logtagptr) cv_temp_logtagptr = CV_LOGTAG_PTR_CAST(CV_LOGTAG_FALLBACK); \
|
if (!cv_temp_logtagptr) cv_temp_logtagptr = CV_LOGTAG_PTR_CAST(CV_LOGTAG_FALLBACK); \
|
||||||
if (!cv_temp_logtagptr) cv_temp_logtagptr = CV_LOGTAG_PTR_CAST(CV_LOGTAG_GLOBAL); \
|
if (!cv_temp_logtagptr) cv_temp_logtagptr = CV_LOGTAG_PTR_CAST(CV_LOGTAG_GLOBAL); \
|
||||||
if (cv_temp_logtagptr && (cv_temp_msglevel > cv_temp_logtagptr->level)) break; \
|
if (cv_temp_logtagptr && (cv_temp_msglevel > cv_temp_logtagptr->level)) break; \
|
||||||
|
extra_check1; \
|
||||||
std::stringstream cv_temp_logstream; \
|
std::stringstream cv_temp_logstream; \
|
||||||
cv_temp_logstream << __VA_ARGS__; \
|
cv_temp_logstream << __VA_ARGS__; \
|
||||||
cv::utils::logging::internal::writeLogMessageEx( \
|
cv::utils::logging::internal::writeLogMessageEx( \
|
||||||
@ -124,28 +126,91 @@ struct LogTagAuto
|
|||||||
break; \
|
break; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define CV_LOG_FATAL(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_FATAL, __VA_ARGS__)
|
#define CV_LOG_FATAL(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_FATAL, , , __VA_ARGS__)
|
||||||
#define CV_LOG_ERROR(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, __VA_ARGS__)
|
#define CV_LOG_ERROR(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, , , __VA_ARGS__)
|
||||||
#define CV_LOG_WARNING(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, __VA_ARGS__)
|
#define CV_LOG_WARNING(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, , , __VA_ARGS__)
|
||||||
#define CV_LOG_INFO(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, __VA_ARGS__)
|
#define CV_LOG_INFO(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, , , __VA_ARGS__)
|
||||||
#define CV_LOG_DEBUG(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, __VA_ARGS__)
|
#define CV_LOG_DEBUG(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, , , __VA_ARGS__)
|
||||||
#define CV_LOG_VERBOSE(tag, v, ...) CV_LOG_WITH_TAG(tag, (cv::utils::logging::LOG_LEVEL_VERBOSE + (int)(v)), __VA_ARGS__)
|
#define CV_LOG_VERBOSE(tag, v, ...) CV_LOG_WITH_TAG(tag, (cv::utils::logging::LOG_LEVEL_VERBOSE + (int)(v)), , , __VA_ARGS__)
|
||||||
|
|
||||||
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO
|
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO
|
||||||
# undef CV_LOG_INFO
|
#undef CV_LOG_INFO
|
||||||
# define CV_LOG_INFO(tag, ...)
|
#define CV_LOG_INFO(tag, ...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG
|
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG
|
||||||
# undef CV_LOG_DEBUG
|
#undef CV_LOG_DEBUG
|
||||||
# define CV_LOG_DEBUG(tag, ...)
|
#define CV_LOG_DEBUG(tag, ...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE
|
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE
|
||||||
# undef CV_LOG_VERBOSE
|
#undef CV_LOG_VERBOSE
|
||||||
# define CV_LOG_VERBOSE(tag, v, ...)
|
#define CV_LOG_VERBOSE(tag, v, ...)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//! @cond IGNORED
|
||||||
|
#define CV__LOG_ONCE_CHECK_PRE \
|
||||||
|
static bool _cv_log_once_ ## __LINE__ = false; \
|
||||||
|
if (_cv_log_once_ ## __LINE__) break;
|
||||||
|
|
||||||
|
#define CV__LOG_ONCE_CHECK_POST \
|
||||||
|
_cv_log_once_ ## __LINE__ = true;
|
||||||
|
|
||||||
|
#define CV__LOG_IF_CHECK(logging_cond) \
|
||||||
|
if (!(logging_cond)) break;
|
||||||
|
|
||||||
|
//! @endcond
|
||||||
|
|
||||||
|
|
||||||
|
// CV_LOG_ONCE_XXX macros
|
||||||
|
|
||||||
|
#define CV_LOG_ONCE_ERROR(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__)
|
||||||
|
#define CV_LOG_ONCE_WARNING(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__)
|
||||||
|
#define CV_LOG_ONCE_INFO(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__)
|
||||||
|
#define CV_LOG_ONCE_DEBUG(tag, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__)
|
||||||
|
#define CV_LOG_ONCE_VERBOSE(tag, v, ...) CV_LOG_WITH_TAG(tag, (cv::utils::logging::LOG_LEVEL_VERBOSE + (int)(v)), CV__LOG_ONCE_CHECK_PRE, CV__LOG_ONCE_CHECK_POST, __VA_ARGS__)
|
||||||
|
|
||||||
|
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO
|
||||||
|
#undef CV_LOG_ONCE_INFO
|
||||||
|
#define CV_LOG_ONCE_INFO(tag, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG
|
||||||
|
#undef CV_LOG_ONCE_DEBUG
|
||||||
|
#define CV_LOG_ONCE_DEBUG(tag, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE
|
||||||
|
#undef CV_LOG_ONCE_VERBOSE
|
||||||
|
#define CV_LOG_ONCE_VERBOSE(tag, v, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
// CV_LOG_IF_XXX macros
|
||||||
|
|
||||||
|
#define CV_LOG_IF_FATAL(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_FATAL, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__)
|
||||||
|
#define CV_LOG_IF_ERROR(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_ERROR, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__)
|
||||||
|
#define CV_LOG_IF_WARNING(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_WARNING, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__)
|
||||||
|
#define CV_LOG_IF_INFO(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_INFO, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__)
|
||||||
|
#define CV_LOG_IF_DEBUG(tag, logging_cond, ...) CV_LOG_WITH_TAG(tag, cv::utils::logging::LOG_LEVEL_DEBUG, , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__)
|
||||||
|
#define CV_LOG_IF_VERBOSE(tag, v, logging_cond, ...) CV_LOG_WITH_TAG(tag, (cv::utils::logging::LOG_LEVEL_VERBOSE + (int)(v)), , CV__LOG_IF_CHECK(logging_cond), __VA_ARGS__)
|
||||||
|
|
||||||
|
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_INFO
|
||||||
|
#undef CV_LOG_IF_INFO
|
||||||
|
#define CV_LOG_IF_INFO(tag, logging_cond, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_DEBUG
|
||||||
|
#undef CV_LOG_IF_DEBUG
|
||||||
|
#define CV_LOG_IF_DEBUG(tag, logging_cond, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if CV_LOG_STRIP_LEVEL <= CV_LOG_LEVEL_VERBOSE
|
||||||
|
#undef CV_LOG_IF_VERBOSE
|
||||||
|
#define CV_LOG_IF_VERBOSE(tag, v, logging_cond, ...)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
//! @}
|
//! @}
|
||||||
|
|
||||||
}}} // namespace
|
}}} // namespace
|
||||||
|
@ -193,8 +193,8 @@ void writeLogMessage(LogLevel logLevel, const char* message)
|
|||||||
case LOG_LEVEL_INFO: ss << "[ INFO:" << threadID << "] " << message << std::endl; break;
|
case LOG_LEVEL_INFO: ss << "[ INFO:" << threadID << "] " << message << std::endl; break;
|
||||||
case LOG_LEVEL_DEBUG: ss << "[DEBUG:" << threadID << "] " << message << std::endl; break;
|
case LOG_LEVEL_DEBUG: ss << "[DEBUG:" << threadID << "] " << message << std::endl; break;
|
||||||
case LOG_LEVEL_VERBOSE: ss << message << std::endl; break;
|
case LOG_LEVEL_VERBOSE: ss << message << std::endl; break;
|
||||||
default:
|
case LOG_LEVEL_SILENT: return; // avoid compiler warning about incomplete switch
|
||||||
return;
|
case ENUM_LOG_LEVEL_FORCE_INT: return; // avoid compiler warning about incomplete switch
|
||||||
}
|
}
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
int android_logLevel = ANDROID_LOG_INFO;
|
int android_logLevel = ANDROID_LOG_INFO;
|
||||||
|
@ -117,8 +117,17 @@ public:
|
|||||||
|
|
||||||
void transpose(const MatExpr& expr, MatExpr& res) const CV_OVERRIDE;
|
void transpose(const MatExpr& expr, MatExpr& res) const CV_OVERRIDE;
|
||||||
|
|
||||||
|
Size size(const MatExpr& expr) const CV_OVERRIDE
|
||||||
|
{
|
||||||
|
return Size(
|
||||||
|
(expr.flags & GEMM_2_T) ? expr.b.rows : expr.b.cols,
|
||||||
|
(expr.flags & GEMM_1_T) ? expr.a.cols : expr.a.rows
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
static void makeExpr(MatExpr& res, int flags, const Mat& a, const Mat& b,
|
static void makeExpr(MatExpr& res, int flags, const Mat& a, const Mat& b,
|
||||||
double alpha=1, const Mat& c=Mat(), double beta=1);
|
double alpha=1, const Mat& c=Mat(), double beta=1);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static MatOp_GEMM g_MatOp_GEMM;
|
static MatOp_GEMM g_MatOp_GEMM;
|
||||||
@ -199,7 +208,7 @@ static inline bool isReciprocal(const MatExpr& e) { return isBin(e,'/') && (!e.b
|
|||||||
static inline bool isT(const MatExpr& e) { return e.op == &g_MatOp_T; }
|
static inline bool isT(const MatExpr& e) { return e.op == &g_MatOp_T; }
|
||||||
static inline bool isInv(const MatExpr& e) { return e.op == &g_MatOp_Invert; }
|
static inline bool isInv(const MatExpr& e) { return e.op == &g_MatOp_Invert; }
|
||||||
static inline bool isSolve(const MatExpr& e) { return e.op == &g_MatOp_Solve; }
|
static inline bool isSolve(const MatExpr& e) { return e.op == &g_MatOp_Solve; }
|
||||||
static inline bool isGEMM(const MatExpr& e) { return e.op == &g_MatOp_GEMM; }
|
//static inline bool isGEMM(const MatExpr& e) { return e.op == &g_MatOp_GEMM; }
|
||||||
static inline bool isMatProd(const MatExpr& e) { return e.op == &g_MatOp_GEMM && (!e.c.data || e.beta == 0); }
|
static inline bool isMatProd(const MatExpr& e) { return e.op == &g_MatOp_GEMM && (!e.c.data || e.beta == 0); }
|
||||||
static inline bool isInitializer(const MatExpr& e) { return e.op == getGlobalMatOpInitializer(); }
|
static inline bool isInitializer(const MatExpr& e) { return e.op == getGlobalMatOpInitializer(); }
|
||||||
|
|
||||||
@ -1240,8 +1249,6 @@ Size MatExpr::size() const
|
|||||||
{
|
{
|
||||||
if( isT(*this) || isInv(*this) )
|
if( isT(*this) || isInv(*this) )
|
||||||
return Size(a.rows, a.cols);
|
return Size(a.rows, a.cols);
|
||||||
if( isGEMM(*this) )
|
|
||||||
return Size(b.cols, a.rows);
|
|
||||||
if( isSolve(*this) )
|
if( isSolve(*this) )
|
||||||
return Size(b.cols, a.cols);
|
return Size(b.cols, a.cols);
|
||||||
if( isInitializer(*this) )
|
if( isInitializer(*this) )
|
||||||
|
@ -2019,6 +2019,29 @@ TEST(Core_MatExpr, issue_16655)
|
|||||||
<< "Mat: CV_8UC3 != " << typeToString(ab_mat.type());
|
<< "Mat: CV_8UC3 != " << typeToString(ab_mat.type());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(Core_MatExpr, issue_16689)
|
||||||
|
{
|
||||||
|
Mat a(Size(10, 5), CV_32FC1, 5);
|
||||||
|
Mat b(Size(10, 5), CV_32FC1, 2);
|
||||||
|
Mat bt(Size(5, 10), CV_32FC1, 3);
|
||||||
|
{
|
||||||
|
MatExpr r = a * bt; // gemm
|
||||||
|
EXPECT_EQ(Mat(r).size(), r.size()) << "[10x5] x [5x10] => [5x5]";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
MatExpr r = a * b.t(); // gemm
|
||||||
|
EXPECT_EQ(Mat(r).size(), r.size()) << "[10x5] x [10x5].t() => [5x5]";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
MatExpr r = a.t() * b; // gemm
|
||||||
|
EXPECT_EQ(Mat(r).size(), r.size()) << "[10x5].t() x [10x5] => [10x10]";
|
||||||
|
}
|
||||||
|
{
|
||||||
|
MatExpr r = a.t() * bt.t(); // gemm
|
||||||
|
EXPECT_EQ(Mat(r).size(), r.size()) << "[10x5].t() x [5x10].t() => [10x10]";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_EIGEN
|
#ifdef HAVE_EIGEN
|
||||||
TEST(Core_Eigen, eigen2cv_check_Mat_type)
|
TEST(Core_Eigen, eigen2cv_check_Mat_type)
|
||||||
{
|
{
|
||||||
|
@ -2,6 +2,9 @@
|
|||||||
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
// It is subject to the license terms in the LICENSE file found in the top-level directory
|
||||||
// of this distribution and at http://opencv.org/license.html.
|
// of this distribution and at http://opencv.org/license.html.
|
||||||
#include "test_precomp.hpp"
|
#include "test_precomp.hpp"
|
||||||
|
#include "opencv2/core/utils/logger.defines.hpp"
|
||||||
|
#undef CV_LOG_STRIP_LEVEL
|
||||||
|
#define CV_LOG_STRIP_LEVEL CV_LOG_LEVEL_VERBOSE + 1
|
||||||
#include "opencv2/core/utils/logger.hpp"
|
#include "opencv2/core/utils/logger.hpp"
|
||||||
#include "opencv2/core/utils/buffer_area.private.hpp"
|
#include "opencv2/core/utils/buffer_area.private.hpp"
|
||||||
|
|
||||||
@ -287,6 +290,53 @@ TEST(CommandLineParser, testScalar)
|
|||||||
EXPECT_EQ(parser.get<Scalar>("s5"), Scalar(5, -4, 3, 2));
|
EXPECT_EQ(parser.get<Scalar>("s5"), Scalar(5, -4, 3, 2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(Logger, DISABLED_message)
|
||||||
|
{
|
||||||
|
int id = 42;
|
||||||
|
CV_LOG_VERBOSE(NULL, 0, "Verbose message: " << id);
|
||||||
|
CV_LOG_VERBOSE(NULL, 1, "Verbose message: " << id);
|
||||||
|
CV_LOG_DEBUG(NULL, "Debug message: " << id);
|
||||||
|
CV_LOG_INFO(NULL, "Info message: " << id);
|
||||||
|
CV_LOG_WARNING(NULL, "Warning message: " << id);
|
||||||
|
CV_LOG_ERROR(NULL, "Error message: " << id);
|
||||||
|
CV_LOG_FATAL(NULL, "Fatal message: " << id);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int testLoggerMessageOnce(int id)
|
||||||
|
{
|
||||||
|
CV_LOG_ONCE_VERBOSE(NULL, 0, "Verbose message: " << id++);
|
||||||
|
CV_LOG_ONCE_VERBOSE(NULL, 1, "Verbose message: " << id++);
|
||||||
|
CV_LOG_ONCE_DEBUG(NULL, "Debug message: " << id++);
|
||||||
|
CV_LOG_ONCE_INFO(NULL, "Info message: " << id++);
|
||||||
|
CV_LOG_ONCE_WARNING(NULL, "Warning message: " << id++);
|
||||||
|
CV_LOG_ONCE_ERROR(NULL, "Error message: " << id++);
|
||||||
|
// doesn't make sense: CV_LOG_ONCE_FATAL
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
TEST(Logger, DISABLED_message_once)
|
||||||
|
{
|
||||||
|
int check_id_first = testLoggerMessageOnce(42);
|
||||||
|
EXPECT_GT(check_id_first, 42);
|
||||||
|
int check_id_second = testLoggerMessageOnce(0);
|
||||||
|
EXPECT_EQ(0, check_id_second);
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(Logger, DISABLED_message_if)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < 100; i++)
|
||||||
|
{
|
||||||
|
CV_LOG_IF_VERBOSE(NULL, 0, i == 0 || i == 42, "Verbose message: " << i);
|
||||||
|
CV_LOG_IF_VERBOSE(NULL, 1, i == 0 || i == 42, "Verbose message: " << i);
|
||||||
|
CV_LOG_IF_DEBUG(NULL, i == 0 || i == 42, "Debug message: " << i);
|
||||||
|
CV_LOG_IF_INFO(NULL, i == 0 || i == 42, "Info message: " << i);
|
||||||
|
CV_LOG_IF_WARNING(NULL, i == 0 || i == 42, "Warning message: " << i);
|
||||||
|
CV_LOG_IF_ERROR(NULL, i == 0 || i == 42, "Error message: " << i);
|
||||||
|
CV_LOG_IF_FATAL(NULL, i == 0 || i == 42, "Fatal message: " << i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TEST(Samples, findFile)
|
TEST(Samples, findFile)
|
||||||
{
|
{
|
||||||
cv::utils::logging::LogLevel prev = cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_VERBOSE);
|
cv::utils::logging::LogLevel prev = cv::utils::logging::setLogLevel(cv::utils::logging::LOG_LEVEL_VERBOSE);
|
||||||
|
@ -69,8 +69,12 @@ int Subgraph::getInputNodeId(const Ptr<ImportGraphWrapper>& net,
|
|||||||
const int numNodes = net->getNumNodes();
|
const int numNodes = net->getNumNodes();
|
||||||
for (int i = 0; i < numNodes; ++i)
|
for (int i = 0; i < numNodes; ++i)
|
||||||
{
|
{
|
||||||
if (net->getNodeName(i) == name)
|
const int numOutputs = net->getNumOutputs(i);
|
||||||
return i;
|
for (int j = 0; j < numOutputs; j++)
|
||||||
|
{
|
||||||
|
if (net->getOutputName(i, j) == name)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
CV_Error(Error::StsParseError, "Input node with name " + name + " not found");
|
CV_Error(Error::StsParseError, "Input node with name " + name + " not found");
|
||||||
}
|
}
|
||||||
@ -111,12 +115,12 @@ bool Subgraph::match(const Ptr<ImportGraphWrapper>& net, int nodeId,
|
|||||||
continue;
|
continue;
|
||||||
nodeId = getInputNodeId(net, node, j);
|
nodeId = getInputNodeId(net, node, j);
|
||||||
const Ptr<ImportNodeWrapper> inpNode = net->getNode(nodeId);
|
const Ptr<ImportNodeWrapper> inpNode = net->getNode(nodeId);
|
||||||
if (inpNode->getType() != "Const")
|
if (inpNode->getType() != "Const" && inpNode->getType() != "Constant")
|
||||||
{
|
{
|
||||||
nodesToMatch.push(nodeId);
|
nodesToMatch.push(nodeId);
|
||||||
targetNodes.push(inputNodes[j]);
|
targetNodes.push(inputNodes[j]);
|
||||||
}
|
}
|
||||||
else if (nodes[inputNodes[j]] != "Const")
|
else if (nodes[inputNodes[j]] != "Const" && nodes[inputNodes[j]] != "Constant")
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
matchedNodesIds.push_back(nodeToMatch);
|
matchedNodesIds.push_back(nodeToMatch);
|
||||||
@ -190,15 +194,14 @@ void simplifySubgraphs(const Ptr<ImportGraphWrapper>& net,
|
|||||||
{
|
{
|
||||||
int numNodes = net->getNumNodes();
|
int numNodes = net->getNumNodes();
|
||||||
std::vector<int> matchedNodesIds, targetNodesIds;
|
std::vector<int> matchedNodesIds, targetNodesIds;
|
||||||
for (int i = 0; i < numNodes; ++i)
|
for (int j = 0; j < patterns.size(); ++j)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < patterns.size(); ++j)
|
for (int i = 0; i < numNodes; ++i)
|
||||||
{
|
{
|
||||||
if (patterns[j]->match(net, i, matchedNodesIds, targetNodesIds))
|
if (patterns[j]->match(net, i, matchedNodesIds, targetNodesIds))
|
||||||
{
|
{
|
||||||
patterns[j]->replace(net, matchedNodesIds, targetNodesIds);
|
patterns[j]->replace(net, matchedNodesIds, targetNodesIds);
|
||||||
numNodes -= matchedNodesIds.size() - 1; // #matchedNodes removed and one added.
|
numNodes -= matchedNodesIds.size() - 1; // #matchedNodes removed and one added.
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -39,7 +39,9 @@ public:
|
|||||||
|
|
||||||
virtual int getNumNodes() const = 0;
|
virtual int getNumNodes() const = 0;
|
||||||
|
|
||||||
virtual std::string getNodeName(int idx) const = 0;
|
virtual int getNumOutputs(int nodeId) const = 0;
|
||||||
|
|
||||||
|
virtual std::string getOutputName(int nodeId, int outId) const = 0;
|
||||||
|
|
||||||
virtual void removeNode(int idx) = 0;
|
virtual void removeNode(int idx) = 0;
|
||||||
};
|
};
|
||||||
|
@ -76,12 +76,21 @@ public:
|
|||||||
return numInputs + net.node_size();
|
return numInputs + net.node_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::string getNodeName(int idx) const CV_OVERRIDE
|
virtual int getNumOutputs(int nodeId) const CV_OVERRIDE
|
||||||
{
|
{
|
||||||
if (idx < numInputs)
|
if (nodeId < numInputs)
|
||||||
return net.input(idx).name();
|
return 1;
|
||||||
else
|
else
|
||||||
return net.node(idx - numInputs).output(0);
|
return net.node(nodeId - numInputs).output_size();
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual std::string getOutputName(int nodeId, int outId) const CV_OVERRIDE
|
||||||
|
{
|
||||||
|
CV_Assert(outId < getNumOutputs(nodeId));
|
||||||
|
if (nodeId < numInputs)
|
||||||
|
return net.input(nodeId).name();
|
||||||
|
else
|
||||||
|
return net.node(nodeId - numInputs).output(outId);
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void removeNode(int idx) CV_OVERRIDE
|
virtual void removeNode(int idx) CV_OVERRIDE
|
||||||
@ -145,13 +154,221 @@ private:
|
|||||||
int axis;
|
int axis;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class GatherCastSubgraph : public Subgraph
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
GatherCastSubgraph()
|
||||||
|
{
|
||||||
|
int input = addNodeToMatch("");
|
||||||
|
int index = addNodeToMatch("Constant");
|
||||||
|
int gather = addNodeToMatch("Gather", input, index);
|
||||||
|
addNodeToMatch("Cast", gather);
|
||||||
|
setFusedNode("Gather", input, index);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class MulCastSubgraph : public Subgraph
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
MulCastSubgraph()
|
||||||
|
{
|
||||||
|
int input = addNodeToMatch("");
|
||||||
|
int scaleNode = addNodeToMatch("Constant");
|
||||||
|
int mul = addNodeToMatch("Mul", input, scaleNode);
|
||||||
|
addNodeToMatch("Cast", mul);
|
||||||
|
setFusedNode("Mul", input, scaleNode);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ExtractScalesSubgraph : public Subgraph
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ExtractScalesSubgraph()
|
||||||
|
{
|
||||||
|
input = addNodeToMatch("");
|
||||||
|
|
||||||
|
int indexH = addNodeToMatch("Constant");
|
||||||
|
int shape1 = addNodeToMatch("Shape", input);
|
||||||
|
int gather1 = addNodeToMatch("Gather", shape1, indexH);
|
||||||
|
scaleHNode = addNodeToMatch("Constant");
|
||||||
|
int mul1 = addNodeToMatch("Mul", gather1, scaleHNode);
|
||||||
|
int floor1 = addNodeToMatch("Floor", mul1);
|
||||||
|
|
||||||
|
int indexW = addNodeToMatch("Constant");
|
||||||
|
int shape2 = addNodeToMatch("Shape", input);
|
||||||
|
int gather2 = addNodeToMatch("Gather", shape2, indexW);
|
||||||
|
scaleWNode = addNodeToMatch("Constant");
|
||||||
|
int mul2 = addNodeToMatch("Mul", gather2, scaleWNode);
|
||||||
|
int floor2 = addNodeToMatch("Floor", mul2);
|
||||||
|
|
||||||
|
int unsqueeze1 = addNodeToMatch("Unsqueeze", floor1);
|
||||||
|
int unsqueeze2 = addNodeToMatch("Unsqueeze", floor2);
|
||||||
|
concatId = addNodeToMatch("Concat", unsqueeze1, unsqueeze2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void finalize(const Ptr<ImportGraphWrapper>& net,
|
||||||
|
const Ptr<ImportNodeWrapper>& fusedNode,
|
||||||
|
std::vector<Ptr<ImportNodeWrapper> >& inputs) CV_OVERRIDE
|
||||||
|
{
|
||||||
|
opencv_onnx::NodeProto* constant_node = inputs[1].dynamicCast<ONNXNodeWrapper>()->node;
|
||||||
|
opencv_onnx::TensorProto tensor_proto = constant_node->attribute(0).t();
|
||||||
|
Mat scaleW = getMatFromTensor(tensor_proto);
|
||||||
|
CV_Assert(scaleW.total() == 1);
|
||||||
|
scaleW.convertTo(scaleW, CV_32F);
|
||||||
|
|
||||||
|
constant_node = inputs[2].dynamicCast<ONNXNodeWrapper>()->node;
|
||||||
|
tensor_proto = constant_node->attribute(0).t();
|
||||||
|
Mat scaleH = getMatFromTensor(tensor_proto);
|
||||||
|
CV_Assert(scaleH.total() == 1);
|
||||||
|
scaleH.convertTo(scaleH, CV_32F);
|
||||||
|
|
||||||
|
opencv_onnx::NodeProto* node = fusedNode.dynamicCast<ONNXNodeWrapper>()->node;
|
||||||
|
opencv_onnx::AttributeProto* attrH = node->add_attribute();
|
||||||
|
attrH->set_name("height_scale");
|
||||||
|
attrH->set_i(scaleH.at<float>(0));
|
||||||
|
opencv_onnx::AttributeProto* attrW = node->add_attribute();
|
||||||
|
attrW->set_name("width_scale");
|
||||||
|
attrW->set_i(scaleW.at<float>(0));
|
||||||
|
|
||||||
|
node->mutable_input()->DeleteSubrange(1, 2); // Remove two last inputs
|
||||||
|
}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
int input, concatId;
|
||||||
|
int scaleHNode, scaleWNode;
|
||||||
|
};
|
||||||
|
|
||||||
|
class UpsampleSubgraph : public ExtractScalesSubgraph
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
UpsampleSubgraph() : ExtractScalesSubgraph()
|
||||||
|
{
|
||||||
|
int shape = addNodeToMatch("Shape", input);
|
||||||
|
int slice = addNodeToMatch("Slice", shape);
|
||||||
|
|
||||||
|
int castConcat = addNodeToMatch("Cast", concatId);
|
||||||
|
int castSlice = addNodeToMatch("Cast", slice);
|
||||||
|
int divide = addNodeToMatch("Div", castConcat, castSlice);
|
||||||
|
|
||||||
|
int constant = addNodeToMatch("Constant");
|
||||||
|
int concat = addNodeToMatch("Concat", constant, divide);
|
||||||
|
|
||||||
|
addNodeToMatch("Upsample", input, concat);
|
||||||
|
setFusedNode("Upsample", input, scaleWNode, scaleHNode);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ResizeSubgraph1 : public ExtractScalesSubgraph
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ResizeSubgraph1() : ExtractScalesSubgraph()
|
||||||
|
{
|
||||||
|
int shape = addNodeToMatch("Shape", input);
|
||||||
|
int slice = addNodeToMatch("Slice", shape, addNodeToMatch("Constant"), addNodeToMatch("Constant"), addNodeToMatch("Constant"));
|
||||||
|
|
||||||
|
int castConcat = addNodeToMatch("Cast", concatId);
|
||||||
|
int concat = addNodeToMatch("Concat", slice, castConcat);
|
||||||
|
int constant = addNodeToMatch("Constant");
|
||||||
|
|
||||||
|
addNodeToMatch("Resize", input, constant, constant, concat);
|
||||||
|
setFusedNode("Upsample", input, scaleWNode, scaleHNode);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class ResizeSubgraph2 : public ExtractScalesSubgraph
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ResizeSubgraph2() : ExtractScalesSubgraph()
|
||||||
|
{
|
||||||
|
int constantConcat = addNodeToMatch("Constant");
|
||||||
|
int castConcat = addNodeToMatch("Cast", concatId);
|
||||||
|
int concat = addNodeToMatch("Concat", constantConcat, castConcat);
|
||||||
|
int constant = addNodeToMatch("Constant");
|
||||||
|
|
||||||
|
addNodeToMatch("Resize", input, constant, constant, concat);
|
||||||
|
setFusedNode("Upsample", input, scaleWNode, scaleHNode);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
void simplifySubgraphs(opencv_onnx::GraphProto& net)
|
void simplifySubgraphs(opencv_onnx::GraphProto& net)
|
||||||
{
|
{
|
||||||
std::vector<Ptr<Subgraph> > subgraphs;
|
std::vector<Ptr<Subgraph> > subgraphs;
|
||||||
|
subgraphs.push_back(makePtr<GatherCastSubgraph>());
|
||||||
|
subgraphs.push_back(makePtr<MulCastSubgraph>());
|
||||||
|
subgraphs.push_back(makePtr<UpsampleSubgraph>());
|
||||||
|
subgraphs.push_back(makePtr<ResizeSubgraph1>());
|
||||||
|
subgraphs.push_back(makePtr<ResizeSubgraph2>());
|
||||||
subgraphs.push_back(makePtr<SoftMaxSubgraph>());
|
subgraphs.push_back(makePtr<SoftMaxSubgraph>());
|
||||||
|
|
||||||
simplifySubgraphs(Ptr<ImportGraphWrapper>(new ONNXGraphWrapper(net)), subgraphs);
|
simplifySubgraphs(Ptr<ImportGraphWrapper>(new ONNXGraphWrapper(net)), subgraphs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Mat getMatFromTensor(opencv_onnx::TensorProto& tensor_proto)
|
||||||
|
{
|
||||||
|
if (tensor_proto.raw_data().empty() && tensor_proto.float_data().empty() &&
|
||||||
|
tensor_proto.double_data().empty() && tensor_proto.int64_data().empty())
|
||||||
|
return Mat();
|
||||||
|
|
||||||
|
opencv_onnx::TensorProto_DataType datatype = tensor_proto.data_type();
|
||||||
|
Mat blob;
|
||||||
|
std::vector<int> sizes;
|
||||||
|
for (int i = 0; i < tensor_proto.dims_size(); i++) {
|
||||||
|
sizes.push_back(tensor_proto.dims(i));
|
||||||
|
}
|
||||||
|
if (sizes.empty())
|
||||||
|
sizes.assign(1, 1);
|
||||||
|
if (datatype == opencv_onnx::TensorProto_DataType_FLOAT) {
|
||||||
|
|
||||||
|
if (!tensor_proto.float_data().empty()) {
|
||||||
|
const ::google::protobuf::RepeatedField<float> field = tensor_proto.float_data();
|
||||||
|
Mat(sizes, CV_32FC1, (void*)field.data()).copyTo(blob);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
char* val = const_cast<char*>(tensor_proto.raw_data().c_str());
|
||||||
|
Mat(sizes, CV_32FC1, val).copyTo(blob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (datatype == opencv_onnx::TensorProto_DataType_DOUBLE)
|
||||||
|
{
|
||||||
|
const ::google::protobuf::RepeatedField<double> field = tensor_proto.double_data();
|
||||||
|
CV_Assert(!field.empty());
|
||||||
|
Mat(sizes, CV_64FC1, (void*)field.data()).convertTo(blob, CV_32FC1);
|
||||||
|
}
|
||||||
|
else if (datatype == opencv_onnx::TensorProto_DataType_INT64)
|
||||||
|
{
|
||||||
|
blob.create(sizes, CV_32SC1);
|
||||||
|
int32_t* dst = reinterpret_cast<int32_t*>(blob.data);
|
||||||
|
|
||||||
|
if (!tensor_proto.int64_data().empty()) {
|
||||||
|
::google::protobuf::RepeatedField< ::google::protobuf::int64> src = tensor_proto.int64_data();
|
||||||
|
convertInt64ToInt32(src, dst, blob.total());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
const char* val = tensor_proto.raw_data().c_str();
|
||||||
|
#if CV_STRONG_ALIGNMENT
|
||||||
|
// Aligned pointer is required: https://github.com/opencv/opencv/issues/16373
|
||||||
|
// this doesn't work: typedef int64_t CV_DECL_ALIGNED(1) unaligned_int64_t;
|
||||||
|
AutoBuffer<int64_t, 16> aligned_val;
|
||||||
|
if (!isAligned<sizeof(int64_t)>(val))
|
||||||
|
{
|
||||||
|
size_t sz = tensor_proto.raw_data().size();
|
||||||
|
aligned_val.allocate(divUp(sz, sizeof(int64_t)));
|
||||||
|
memcpy(aligned_val.data(), val, sz);
|
||||||
|
val = (const char*)aligned_val.data();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
const int64_t* src = reinterpret_cast<const int64_t*>(val);
|
||||||
|
convertInt64ToInt32(src, dst, blob.total());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
CV_Error(Error::StsUnsupportedFormat, "Unsupported data type: " +
|
||||||
|
opencv_onnx::TensorProto_DataType_Name(datatype));
|
||||||
|
if (tensor_proto.dims_size() == 0)
|
||||||
|
blob.dims = 1; // To force 1-dimensional cv::Mat for scalars.
|
||||||
|
return blob;
|
||||||
|
}
|
||||||
|
|
||||||
CV__DNN_INLINE_NS_END
|
CV__DNN_INLINE_NS_END
|
||||||
}} // namespace cv::dnn
|
}} // namespace cv::dnn
|
||||||
|
@ -24,6 +24,19 @@ CV__DNN_INLINE_NS_BEGIN
|
|||||||
|
|
||||||
void simplifySubgraphs(opencv_onnx::GraphProto& net);
|
void simplifySubgraphs(opencv_onnx::GraphProto& net);
|
||||||
|
|
||||||
|
template<typename T1, typename T2>
|
||||||
|
void convertInt64ToInt32(const T1& src, T2& dst, int size)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < size; i++) {
|
||||||
|
if (src[i] < std::numeric_limits<int32_t>::min() || src[i] > std::numeric_limits<int32_t>::max()) {
|
||||||
|
CV_Error(Error::StsOutOfRange, "Input is out of OpenCV 32S range");
|
||||||
|
}
|
||||||
|
dst[i] = saturate_cast<int32_t>(src[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Mat getMatFromTensor(opencv_onnx::TensorProto& tensor_proto);
|
||||||
|
|
||||||
CV__DNN_INLINE_NS_END
|
CV__DNN_INLINE_NS_END
|
||||||
}} // namespace dnn, namespace cv
|
}} // namespace dnn, namespace cv
|
||||||
|
|
||||||
|
@ -95,83 +95,6 @@ void releaseONNXTensor(opencv_onnx::TensorProto& tensor_proto)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T1, typename T2>
|
|
||||||
void convertInt64ToInt32(const T1& src, T2& dst, int size)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < size; i++) {
|
|
||||||
if (src[i] < std::numeric_limits<int32_t>::min() || src[i] > std::numeric_limits<int32_t>::max()) {
|
|
||||||
CV_Error(Error::StsOutOfRange, "Input is out of OpenCV 32S range");
|
|
||||||
}
|
|
||||||
dst[i] = saturate_cast<int32_t>(src[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Mat getMatFromTensor(opencv_onnx::TensorProto& tensor_proto)
|
|
||||||
{
|
|
||||||
CV_Assert(!tensor_proto.raw_data().empty() || !tensor_proto.float_data().empty()
|
|
||||||
|| !tensor_proto.double_data().empty() || !tensor_proto.int64_data().empty());
|
|
||||||
|
|
||||||
opencv_onnx::TensorProto_DataType datatype = tensor_proto.data_type();
|
|
||||||
Mat blob;
|
|
||||||
std::vector<int> sizes;
|
|
||||||
for (int i = 0; i < tensor_proto.dims_size(); i++) {
|
|
||||||
sizes.push_back(tensor_proto.dims(i));
|
|
||||||
}
|
|
||||||
if (sizes.empty())
|
|
||||||
sizes.assign(1, 1);
|
|
||||||
if (datatype == opencv_onnx::TensorProto_DataType_FLOAT) {
|
|
||||||
|
|
||||||
if (!tensor_proto.float_data().empty()) {
|
|
||||||
const ::google::protobuf::RepeatedField<float> field = tensor_proto.float_data();
|
|
||||||
Mat(sizes, CV_32FC1, (void*)field.data()).copyTo(blob);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
char* val = const_cast<char*>(tensor_proto.raw_data().c_str());
|
|
||||||
Mat(sizes, CV_32FC1, val).copyTo(blob);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (datatype == opencv_onnx::TensorProto_DataType_DOUBLE)
|
|
||||||
{
|
|
||||||
const ::google::protobuf::RepeatedField<double> field = tensor_proto.double_data();
|
|
||||||
CV_Assert(!field.empty());
|
|
||||||
Mat(sizes, CV_64FC1, (void*)field.data()).convertTo(blob, CV_32FC1);
|
|
||||||
}
|
|
||||||
else if (datatype == opencv_onnx::TensorProto_DataType_INT64)
|
|
||||||
{
|
|
||||||
blob.create(sizes, CV_32SC1);
|
|
||||||
int32_t* dst = reinterpret_cast<int32_t*>(blob.data);
|
|
||||||
|
|
||||||
if (!tensor_proto.int64_data().empty()) {
|
|
||||||
::google::protobuf::RepeatedField< ::google::protobuf::int64> src = tensor_proto.int64_data();
|
|
||||||
convertInt64ToInt32(src, dst, blob.total());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
const char* val = tensor_proto.raw_data().c_str();
|
|
||||||
#if CV_STRONG_ALIGNMENT
|
|
||||||
// Aligned pointer is required: https://github.com/opencv/opencv/issues/16373
|
|
||||||
// this doesn't work: typedef int64_t CV_DECL_ALIGNED(1) unaligned_int64_t;
|
|
||||||
AutoBuffer<int64_t, 16> aligned_val;
|
|
||||||
if (!isAligned<sizeof(int64_t)>(val))
|
|
||||||
{
|
|
||||||
size_t sz = tensor_proto.raw_data().size();
|
|
||||||
aligned_val.allocate(divUp(sz, sizeof(int64_t)));
|
|
||||||
memcpy(aligned_val.data(), val, sz);
|
|
||||||
val = (const char*)aligned_val.data();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
const int64_t* src = reinterpret_cast<const int64_t*>(val);
|
|
||||||
convertInt64ToInt32(src, dst, blob.total());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
CV_Error(Error::StsUnsupportedFormat, "Unsupported data type: " +
|
|
||||||
opencv_onnx::TensorProto_DataType_Name(datatype));
|
|
||||||
if (tensor_proto.dims_size() == 0)
|
|
||||||
blob.dims = 1; // To force 1-dimensional cv::Mat for scalars.
|
|
||||||
return blob;
|
|
||||||
}
|
|
||||||
|
|
||||||
void runLayer(LayerParams& params, const std::vector<Mat>& inputs,
|
void runLayer(LayerParams& params, const std::vector<Mat>& inputs,
|
||||||
std::vector<Mat>& outputs)
|
std::vector<Mat>& outputs)
|
||||||
{
|
{
|
||||||
@ -542,31 +465,6 @@ void ONNXImporter::populateNet(Net dstNet)
|
|||||||
layerParams.blobs.push_back(-1.0f * blob.reshape(1, 1));
|
layerParams.blobs.push_back(-1.0f * blob.reshape(1, 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (layer_type == "Div")
|
|
||||||
{
|
|
||||||
if (constBlobs.find(node_proto.input(1)) == constBlobs.end())
|
|
||||||
{
|
|
||||||
layerParams.type = "Eltwise";
|
|
||||||
layerParams.set("operation", "div");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Mat blob = getBlob(node_proto, constBlobs, 1);
|
|
||||||
CV_Assert_N(blob.type() == CV_32F, blob.total());
|
|
||||||
if (blob.total() == 1)
|
|
||||||
{
|
|
||||||
layerParams.set("scale", 1.0f / blob.at<float>(0));
|
|
||||||
layerParams.type = "Power";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
layerParams.type = "Scale";
|
|
||||||
divide(1.0, blob, blob);
|
|
||||||
layerParams.blobs.push_back(blob);
|
|
||||||
layerParams.set("bias_term", false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (layer_type == "Neg")
|
else if (layer_type == "Neg")
|
||||||
{
|
{
|
||||||
layerParams.type = "Power";
|
layerParams.type = "Power";
|
||||||
@ -715,24 +613,58 @@ void ONNXImporter::populateNet(Net dstNet)
|
|||||||
layerParams.set("bias_term", false);
|
layerParams.set("bias_term", false);
|
||||||
layerParams.set("num_output", layerParams.blobs[0].size[0]);
|
layerParams.set("num_output", layerParams.blobs[0].size[0]);
|
||||||
}
|
}
|
||||||
else if (layer_type == "Mul")
|
else if (layer_type == "Mul" || layer_type == "Div")
|
||||||
{
|
{
|
||||||
CV_Assert(node_proto.input_size() == 2);
|
CV_Assert(node_proto.input_size() == 2);
|
||||||
if (layer_id.find(node_proto.input(1)) == layer_id.end()) {
|
|
||||||
Mat blob = getBlob(node_proto, constBlobs, 1);
|
bool isDiv = layer_type == "Div";
|
||||||
|
int constId = -1;
|
||||||
|
bool haveVariables = false;
|
||||||
|
for (int i = 0; i < 2; ++i)
|
||||||
|
{
|
||||||
|
if (constBlobs.find(node_proto.input(i)) != constBlobs.end())
|
||||||
|
constId = i;
|
||||||
|
else
|
||||||
|
haveVariables = true;
|
||||||
|
}
|
||||||
|
if (constId != -1 && haveVariables)
|
||||||
|
{
|
||||||
|
Mat blob = getBlob(node_proto, constBlobs, constId);
|
||||||
blob = blob.reshape(1, 1);
|
blob = blob.reshape(1, 1);
|
||||||
if (blob.total() == 1) {
|
if (blob.total() == 1) {
|
||||||
layerParams.set("scale", blob.at<float>(0));
|
float coeff = isDiv ? 1.0 / blob.at<float>(0) : blob.at<float>(0);
|
||||||
|
layerParams.set("scale", coeff);
|
||||||
layerParams.type = "Power";
|
layerParams.type = "Power";
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
if (isDiv)
|
||||||
|
divide(1.0, blob, blob);
|
||||||
layerParams.blobs.push_back(blob);
|
layerParams.blobs.push_back(blob);
|
||||||
layerParams.type = "Scale";
|
layerParams.type = "Scale";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
layerParams.type = "Eltwise";
|
layerParams.type = "Eltwise";
|
||||||
layerParams.set("operation", "prod");
|
layerParams.set("operation", isDiv ? "div" : "prod");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!haveVariables)
|
||||||
|
{
|
||||||
|
Mat inp0 = getBlob(node_proto, constBlobs, 0);
|
||||||
|
Mat inp1 = getBlob(node_proto, constBlobs, 1);
|
||||||
|
if (inp0.size != inp1.size)
|
||||||
|
CV_Error(Error::StsNotImplemented, "Constant multiply with different shapes");
|
||||||
|
|
||||||
|
Mat out;
|
||||||
|
if (isDiv)
|
||||||
|
divide(inp0, inp1, out);
|
||||||
|
else
|
||||||
|
multiply(inp0, inp1, out);
|
||||||
|
|
||||||
|
out = out.reshape(1, inp0.dims, inp0.size);
|
||||||
|
out.dims = inp0.dims; // to workaround dims == 1
|
||||||
|
constBlobs.insert(std::make_pair(layerParams.name, out));
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (layer_type == "Conv")
|
else if (layer_type == "Conv")
|
||||||
|
@ -69,9 +69,15 @@ public:
|
|||||||
return net.node_size();
|
return net.node_size();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual std::string getNodeName(int idx) const CV_OVERRIDE
|
virtual int getNumOutputs(int nodeId) const CV_OVERRIDE
|
||||||
{
|
{
|
||||||
return net.node(idx).name();
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual std::string getOutputName(int nodeId, int outId) const CV_OVERRIDE
|
||||||
|
{
|
||||||
|
CV_Assert(outId == 0);
|
||||||
|
return net.node(nodeId).name();
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual void removeNode(int idx) CV_OVERRIDE
|
virtual void removeNode(int idx) CV_OVERRIDE
|
||||||
|
@ -340,6 +340,16 @@ TEST_P(Test_ONNX_layers, Resize)
|
|||||||
testONNXModels("resize_bilinear");
|
testONNXModels("resize_bilinear");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_P(Test_ONNX_layers, ResizeUnfused)
|
||||||
|
{
|
||||||
|
if (backend == DNN_BACKEND_INFERENCE_ENGINE_NN_BUILDER_2019)
|
||||||
|
applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_NN_BUILDER);
|
||||||
|
testONNXModels("upsample_unfused_torch1.2");
|
||||||
|
testONNXModels("upsample_unfused_opset9_torch1.4");
|
||||||
|
testONNXModels("resize_nearest_unfused_opset11_torch1.4");
|
||||||
|
testONNXModels("resize_nearest_unfused_opset11_torch1.3");
|
||||||
|
}
|
||||||
|
|
||||||
TEST_P(Test_ONNX_layers, MultyInputs)
|
TEST_P(Test_ONNX_layers, MultyInputs)
|
||||||
{
|
{
|
||||||
const String model = _tf("models/multy_inputs.onnx");
|
const String model = _tf("models/multy_inputs.onnx");
|
||||||
@ -397,6 +407,8 @@ TEST_P(Test_ONNX_layers, DynamicReshape)
|
|||||||
if (target == DNN_TARGET_OPENCL) applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_OPENCL, CV_TEST_TAG_DNN_SKIP_IE_NN_BUILDER);
|
if (target == DNN_TARGET_OPENCL) applyTestTag(CV_TEST_TAG_DNN_SKIP_IE_OPENCL, CV_TEST_TAG_DNN_SKIP_IE_NN_BUILDER);
|
||||||
}
|
}
|
||||||
testONNXModels("dynamic_reshape");
|
testONNXModels("dynamic_reshape");
|
||||||
|
testONNXModels("dynamic_reshape_opset_11");
|
||||||
|
testONNXModels("flatten_by_prod");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_P(Test_ONNX_layers, Reshape)
|
TEST_P(Test_ONNX_layers, Reshape)
|
||||||
|
@ -39,10 +39,23 @@ PERF_TEST_P(Size_MatType_OutMatDepth, integral,
|
|||||||
Mat sum(sz, sdepth);
|
Mat sum(sz, sdepth);
|
||||||
|
|
||||||
declare.in(src, WARMUP_RNG).out(sum);
|
declare.in(src, WARMUP_RNG).out(sum);
|
||||||
|
if (sdepth == CV_32F)
|
||||||
|
src *= (1 << 23) / (double)(sz.area() * 256); // FP32 calculations are not accurate (mantissa is 23-bit)
|
||||||
|
|
||||||
TEST_CYCLE() integral(src, sum, sdepth);
|
TEST_CYCLE() integral(src, sum, sdepth);
|
||||||
|
|
||||||
SANITY_CHECK(sum, 1e-6);
|
Mat src_roi; src(Rect(src.cols - 4, src.rows - 4, 4, 4)).convertTo(src_roi, sdepth);
|
||||||
|
Mat restored_src_roi =
|
||||||
|
sum(Rect(sum.cols - 4, sum.rows - 4, 4, 4)) + sum(Rect(sum.cols - 5, sum.rows - 5, 4, 4)) -
|
||||||
|
sum(Rect(sum.cols - 4, sum.rows - 5, 4, 4)) - sum(Rect(sum.cols - 5, sum.rows - 4, 4, 4));
|
||||||
|
EXPECT_EQ(0, cvtest::norm(restored_src_roi, src_roi, NORM_INF))
|
||||||
|
<< src_roi << endl << restored_src_roi << endl
|
||||||
|
<< sum(Rect(sum.cols - 4, sum.rows - 4, 4, 4));
|
||||||
|
|
||||||
|
if (sdepth == CV_32F)
|
||||||
|
SANITY_CHECK_NOTHING();
|
||||||
|
else
|
||||||
|
SANITY_CHECK(sum, 1e-6);
|
||||||
}
|
}
|
||||||
|
|
||||||
PERF_TEST_P(Size_MatType_OutMatDepth, integral_sqsum,
|
PERF_TEST_P(Size_MatType_OutMatDepth, integral_sqsum,
|
||||||
|
@ -237,7 +237,11 @@ struct Integral_SIMD<uchar, int, double>
|
|||||||
v_int32 prev_1 = vx_setzero_s32(), prev_2 = vx_setzero_s32(),
|
v_int32 prev_1 = vx_setzero_s32(), prev_2 = vx_setzero_s32(),
|
||||||
prev_3 = vx_setzero_s32();
|
prev_3 = vx_setzero_s32();
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for ( ; j + v_uint16::nlanes * cn <= width; j += v_uint16::nlanes * cn)
|
const int j_max =
|
||||||
|
((_srcstep * i + (width - v_uint16::nlanes * cn + v_uint8::nlanes * cn)) >= _srcstep * height)
|
||||||
|
? width - v_uint8::nlanes * cn // uint8 in v_load_deinterleave()
|
||||||
|
: width - v_uint16::nlanes * cn; // v_expand_low
|
||||||
|
for ( ; j <= j_max; j += v_uint16::nlanes * cn)
|
||||||
{
|
{
|
||||||
v_uint8 v_src_row_1, v_src_row_2, v_src_row_3;
|
v_uint8 v_src_row_1, v_src_row_2, v_src_row_3;
|
||||||
v_load_deinterleave(src_row + j, v_src_row_1, v_src_row_2, v_src_row_3);
|
v_load_deinterleave(src_row + j, v_src_row_1, v_src_row_2, v_src_row_3);
|
||||||
@ -546,7 +550,11 @@ struct Integral_SIMD<uchar, float, double>
|
|||||||
v_float32 prev_1 = vx_setzero_f32(), prev_2 = vx_setzero_f32(),
|
v_float32 prev_1 = vx_setzero_f32(), prev_2 = vx_setzero_f32(),
|
||||||
prev_3 = vx_setzero_f32();
|
prev_3 = vx_setzero_f32();
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for (; j + v_uint16::nlanes * cn <= width; j += v_uint16::nlanes * cn)
|
const int j_max =
|
||||||
|
((_srcstep * i + (width - v_uint16::nlanes * cn + v_uint8::nlanes * cn)) >= _srcstep * height)
|
||||||
|
? width - v_uint8::nlanes * cn // uint8 in v_load_deinterleave()
|
||||||
|
: width - v_uint16::nlanes * cn; // v_expand_low
|
||||||
|
for ( ; j <= j_max; j += v_uint16::nlanes * cn)
|
||||||
{
|
{
|
||||||
v_uint8 v_src_row_1, v_src_row_2, v_src_row_3;
|
v_uint8 v_src_row_1, v_src_row_2, v_src_row_3;
|
||||||
v_load_deinterleave(src_row + j, v_src_row_1, v_src_row_2, v_src_row_3);
|
v_load_deinterleave(src_row + j, v_src_row_1, v_src_row_2, v_src_row_3);
|
||||||
@ -896,7 +904,11 @@ struct Integral_SIMD<uchar, double, double>
|
|||||||
v_float64 prev_1 = vx_setzero_f64(), prev_2 = vx_setzero_f64(),
|
v_float64 prev_1 = vx_setzero_f64(), prev_2 = vx_setzero_f64(),
|
||||||
prev_3 = vx_setzero_f64();
|
prev_3 = vx_setzero_f64();
|
||||||
int j = 0;
|
int j = 0;
|
||||||
for (; j + v_uint16::nlanes * cn <= width; j += v_uint16::nlanes * cn)
|
const int j_max =
|
||||||
|
((_srcstep * i + (width - v_uint16::nlanes * cn + v_uint8::nlanes * cn)) >= _srcstep * height)
|
||||||
|
? width - v_uint8::nlanes * cn // uint8 in v_load_deinterleave()
|
||||||
|
: width - v_uint16::nlanes * cn; // v_expand_low
|
||||||
|
for ( ; j <= j_max; j += v_uint16::nlanes * cn)
|
||||||
{
|
{
|
||||||
v_uint8 v_src_row_1, v_src_row_2, v_src_row_3;
|
v_uint8 v_src_row_1, v_src_row_2, v_src_row_3;
|
||||||
v_load_deinterleave(src_row + j, v_src_row_1, v_src_row_2, v_src_row_3);
|
v_load_deinterleave(src_row + j, v_src_row_1, v_src_row_2, v_src_row_3);
|
||||||
|
@ -571,8 +571,8 @@ class CppHeaderParser(object):
|
|||||||
arg_type, arg_name, modlist, argno = self.parse_arg(a, argno)
|
arg_type, arg_name, modlist, argno = self.parse_arg(a, argno)
|
||||||
if self.wrap_mode:
|
if self.wrap_mode:
|
||||||
# TODO: Vectors should contain UMat, but this is not very easy to support and not very needed
|
# TODO: Vectors should contain UMat, but this is not very easy to support and not very needed
|
||||||
vector_mat = "vector_{}".format("Mat")
|
vector_mat = "vector_{}".format(mat)
|
||||||
vector_mat_template = "vector<{}>".format("Mat")
|
vector_mat_template = "vector<{}>".format(mat)
|
||||||
|
|
||||||
if arg_type == "InputArray":
|
if arg_type == "InputArray":
|
||||||
arg_type = mat
|
arg_type = mat
|
||||||
|
@ -4,8 +4,22 @@ from __future__ import print_function
|
|||||||
import numpy as np
|
import numpy as np
|
||||||
import cv2 as cv
|
import cv2 as cv
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
from tests_common import NewOpenCVTests
|
from tests_common import NewOpenCVTests
|
||||||
|
|
||||||
|
|
||||||
|
def load_exposure_seq(path):
|
||||||
|
images = []
|
||||||
|
times = []
|
||||||
|
with open(os.path.join(path, 'list.txt'), 'r') as list_file:
|
||||||
|
for line in list_file.readlines():
|
||||||
|
name, time = line.split()
|
||||||
|
images.append(cv.imread(os.path.join(path, name)))
|
||||||
|
times.append(1. / float(time))
|
||||||
|
return images, times
|
||||||
|
|
||||||
|
|
||||||
class UMat(NewOpenCVTests):
|
class UMat(NewOpenCVTests):
|
||||||
|
|
||||||
def test_umat_construct(self):
|
def test_umat_construct(self):
|
||||||
@ -85,5 +99,22 @@ class UMat(NewOpenCVTests):
|
|||||||
for data_umat0, data_umat in zip(_p1_mask_err_umat0[:2], _p1_mask_err_umat[:2]):
|
for data_umat0, data_umat in zip(_p1_mask_err_umat0[:2], _p1_mask_err_umat[:2]):
|
||||||
self.assertTrue(np.allclose(data_umat0, data_umat))
|
self.assertTrue(np.allclose(data_umat0, data_umat))
|
||||||
|
|
||||||
|
def test_umat_merge_mertens(self):
|
||||||
|
if self.extraTestDataPath is None:
|
||||||
|
self.fail('Test data is not available')
|
||||||
|
|
||||||
|
test_data_path = os.path.join(self.extraTestDataPath, 'cv', 'hdr')
|
||||||
|
|
||||||
|
images, _ = load_exposure_seq(os.path.join(test_data_path, 'exposures'))
|
||||||
|
|
||||||
|
merge = cv.createMergeMertens()
|
||||||
|
mat_result = merge.process(images)
|
||||||
|
|
||||||
|
umat_images = [cv.UMat(img) for img in images]
|
||||||
|
umat_result = merge.process(umat_images)
|
||||||
|
|
||||||
|
self.assertTrue(np.allclose(umat_result.get(), mat_result))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
NewOpenCVTests.bootstrap()
|
NewOpenCVTests.bootstrap()
|
||||||
|
@ -504,7 +504,7 @@ public:
|
|||||||
best = *i;
|
best = *i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (i->second.isBetterThan(best.second, newType))
|
if (best.second.isEmpty() || i->second.isBetterThan(best.second, newType))
|
||||||
{
|
{
|
||||||
best = *i;
|
best = *i;
|
||||||
}
|
}
|
||||||
|
@ -17,10 +17,10 @@ using namespace std;
|
|||||||
|
|
||||||
enum { DETECTION = 0, CAPTURING = 1, CALIBRATED = 2 };
|
enum { DETECTION = 0, CAPTURING = 1, CALIBRATED = 2 };
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
printf( "\nThis is a camera calibration sample that calibrates 3 horizontally placed cameras together.\n"
|
printf( "\nThis is a camera calibration sample that calibrates 3 horizontally placed cameras together.\n"
|
||||||
"Usage: 3calibration\n"
|
"Usage: %s\n"
|
||||||
" -w=<board_width> # the number of inner corners per one of board dimension\n"
|
" -w=<board_width> # the number of inner corners per one of board dimension\n"
|
||||||
" -h=<board_height> # the number of inner corners per another board dimension\n"
|
" -h=<board_height> # the number of inner corners per another board dimension\n"
|
||||||
" [-s=<squareSize>] # square size in some user-defined units (1 by default)\n"
|
" [-s=<squareSize>] # square size in some user-defined units (1 by default)\n"
|
||||||
@ -29,7 +29,7 @@ static void help()
|
|||||||
" [-a=<aspectRatio>] # fix aspect ratio (fx/fy)\n"
|
" [-a=<aspectRatio>] # fix aspect ratio (fx/fy)\n"
|
||||||
" [-p] # fix the principal point at the center\n"
|
" [-p] # fix the principal point at the center\n"
|
||||||
" [input_data] # input data - text file with a list of the images of the board\n"
|
" [input_data] # input data - text file with a list of the images of the board\n"
|
||||||
"\n" );
|
"\n", argv[0] );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -190,7 +190,7 @@ int main( int argc, char** argv )
|
|||||||
"{zt||}{a|1|}{p||}{@input||}");
|
"{zt||}{a|1|}{p||}{@input||}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
boardSize.width = parser.get<int>("w");
|
boardSize.width = parser.get<int>("w");
|
||||||
@ -207,7 +207,7 @@ int main( int argc, char** argv )
|
|||||||
inputFilename = parser.get<string>("@input");
|
inputFilename = parser.get<string>("@input");
|
||||||
if (!parser.check())
|
if (!parser.check())
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
parser.printErrors();
|
parser.printErrors();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -47,10 +47,10 @@ const char* liveCaptureHelp =
|
|||||||
" 'g' - start capturing images\n"
|
" 'g' - start capturing images\n"
|
||||||
" 'u' - switch undistortion on/off\n";
|
" 'u' - switch undistortion on/off\n";
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
printf( "This is a camera calibration sample.\n"
|
printf( "This is a camera calibration sample.\n"
|
||||||
"Usage: calibration\n"
|
"Usage: %s\n"
|
||||||
" -w=<board_width> # the number of inner corners per one of board dimension\n"
|
" -w=<board_width> # the number of inner corners per one of board dimension\n"
|
||||||
" -h=<board_height> # the number of inner corners per another board dimension\n"
|
" -h=<board_height> # the number of inner corners per another board dimension\n"
|
||||||
" [-pt=<pattern>] # the type of pattern: chessboard or circles' grid\n"
|
" [-pt=<pattern>] # the type of pattern: chessboard or circles' grid\n"
|
||||||
@ -81,7 +81,7 @@ static void help()
|
|||||||
" # the text file can be generated with imagelist_creator\n"
|
" # the text file can be generated with imagelist_creator\n"
|
||||||
" # - name of video file with a video of the board\n"
|
" # - name of video file with a video of the board\n"
|
||||||
" # if input_data not specified, a live view from the camera is used\n"
|
" # if input_data not specified, a live view from the camera is used\n"
|
||||||
"\n" );
|
"\n", argv[0] );
|
||||||
printf("\n%s",usage);
|
printf("\n%s",usage);
|
||||||
printf( "\n%s", liveCaptureHelp );
|
printf( "\n%s", liveCaptureHelp );
|
||||||
}
|
}
|
||||||
@ -378,7 +378,7 @@ int main( int argc, char** argv )
|
|||||||
"{@input_data|0|}");
|
"{@input_data|0|}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
boardSize.width = parser.get<int>( "w" );
|
boardSize.width = parser.get<int>( "w" );
|
||||||
@ -427,7 +427,7 @@ int main( int argc, char** argv )
|
|||||||
}
|
}
|
||||||
if (!parser.check())
|
if (!parser.check())
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
parser.printErrors();
|
parser.printErrors();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#include <opencv2/core/utility.hpp>
|
#include "opencv2/core/utility.hpp"
|
||||||
#include "opencv2/video/tracking.hpp"
|
#include "opencv2/video/tracking.hpp"
|
||||||
#include "opencv2/imgproc.hpp"
|
#include "opencv2/imgproc.hpp"
|
||||||
#include "opencv2/videoio.hpp"
|
#include "opencv2/videoio.hpp"
|
||||||
@ -57,13 +57,13 @@ string hot_keys =
|
|||||||
"\tp - pause video\n"
|
"\tp - pause video\n"
|
||||||
"To initialize tracking, select the object with mouse\n";
|
"To initialize tracking, select the object with mouse\n";
|
||||||
|
|
||||||
static void help()
|
static void help(const char** argv)
|
||||||
{
|
{
|
||||||
cout << "\nThis is a demo that shows mean-shift based tracking\n"
|
cout << "\nThis is a demo that shows mean-shift based tracking\n"
|
||||||
"You select a color objects such as your face and it tracks it.\n"
|
"You select a color objects such as your face and it tracks it.\n"
|
||||||
"This reads from video camera (0 by default, or the camera number the user enters\n"
|
"This reads from video camera (0 by default, or the camera number the user enters\n"
|
||||||
"Usage: \n"
|
"Usage: \n\t";
|
||||||
" ./camshiftdemo [camera number]\n";
|
cout << argv[0] << " [camera number]\n";
|
||||||
cout << hot_keys;
|
cout << hot_keys;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ int main( int argc, const char** argv )
|
|||||||
CommandLineParser parser(argc, argv, keys);
|
CommandLineParser parser(argc, argv, keys);
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int camNum = parser.get<int>(0);
|
int camNum = parser.get<int>(0);
|
||||||
@ -90,7 +90,7 @@ int main( int argc, const char** argv )
|
|||||||
|
|
||||||
if( !cap.isOpened() )
|
if( !cap.isOpened() )
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
cout << "***Could not initialize capturing...***\n";
|
cout << "***Could not initialize capturing...***\n";
|
||||||
cout << "Current parameter's value: \n";
|
cout << "Current parameter's value: \n";
|
||||||
parser.printMessage();
|
parser.printMessage();
|
||||||
|
@ -6,15 +6,16 @@
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout
|
cout
|
||||||
<< "\nThis program illustrates the use of findContours and drawContours\n"
|
<< "\nThis program illustrates the use of findContours and drawContours\n"
|
||||||
<< "The original image is put up along with the image of drawn contours\n"
|
<< "The original image is put up along with the image of drawn contours\n"
|
||||||
<< "Usage:\n"
|
<< "Usage:\n";
|
||||||
<< "./contours2\n"
|
cout
|
||||||
<< "\nA trackbar is put up which controls the contour level from -3 to 3\n"
|
<< argv[0]
|
||||||
<< endl;
|
<< "\nA trackbar is put up which controls the contour level from -3 to 3\n"
|
||||||
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
const int w = 500;
|
const int w = 500;
|
||||||
@ -38,7 +39,7 @@ int main( int argc, char** argv)
|
|||||||
cv::CommandLineParser parser(argc, argv, "{help h||}");
|
cv::CommandLineParser parser(argc, argv, "{help h||}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Mat img = Mat::zeros(w, w, CV_8UC1);
|
Mat img = Mat::zeros(w, w, CV_8UC1);
|
||||||
|
@ -5,11 +5,11 @@
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout << "\nThis sample program demonstrates the use of the convexHull() function\n"
|
cout << "\nThis sample program demonstrates the use of the convexHull() function\n"
|
||||||
<< "Call:\n"
|
<< "Call:\n"
|
||||||
<< "./convexhull\n" << endl;
|
<< argv[0] << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
@ -17,7 +17,7 @@ int main( int argc, char** argv )
|
|||||||
CommandLineParser parser(argc, argv, "{help h||}");
|
CommandLineParser parser(argc, argv, "{help h||}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Mat img(500, 500, CV_8UC3);
|
Mat img(500, 500, CV_8UC3);
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout
|
cout
|
||||||
<< "\n------------------------------------------------------------------\n"
|
<< "\n------------------------------------------------------------------\n"
|
||||||
@ -19,8 +19,8 @@ static void help()
|
|||||||
<< "That is, cv::Mat M(...); cout << M; Now works.\n"
|
<< "That is, cv::Mat M(...); cout << M; Now works.\n"
|
||||||
<< "Output can be formatted to OpenCV, matlab, python, numpy, csv and \n"
|
<< "Output can be formatted to OpenCV, matlab, python, numpy, csv and \n"
|
||||||
<< "C styles Usage:\n"
|
<< "C styles Usage:\n"
|
||||||
<< "./cvout_sample\n"
|
<< argv[0]
|
||||||
<< "------------------------------------------------------------------\n\n"
|
<< "\n------------------------------------------------------------------\n\n"
|
||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -30,7 +30,7 @@ int main(int argc, char** argv)
|
|||||||
cv::CommandLineParser parser(argc, argv, "{help h||}");
|
cv::CommandLineParser parser(argc, argv, "{help h||}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Mat I = Mat::eye(4, 4, CV_64F);
|
Mat I = Mat::eye(4, 4, CV_64F);
|
||||||
|
@ -5,15 +5,15 @@
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout << "\nThis program demonstrates iterative construction of\n"
|
cout << "\nThis program demonstrates iterative construction of\n"
|
||||||
"delaunay triangulation and voronoi tessellation.\n"
|
"delaunay triangulation and voronoi tessellation.\n"
|
||||||
"It draws a random set of points in an image and then delaunay triangulates them.\n"
|
"It draws a random set of points in an image and then delaunay triangulates them.\n"
|
||||||
"Usage: \n"
|
"Usage: \n";
|
||||||
"./delaunay \n"
|
cout << argv[0];
|
||||||
"\nThis program builds the triangulation interactively, you may stop this process by\n"
|
cout << "\n\nThis program builds the triangulation interactively, you may stop this process by\n"
|
||||||
"hitting any key.\n";
|
"hitting any key.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
static void draw_subdiv_point( Mat& img, Point2f fp, Scalar color )
|
static void draw_subdiv_point( Mat& img, Point2f fp, Scalar color )
|
||||||
@ -108,7 +108,7 @@ int main( int argc, char** argv )
|
|||||||
cv::CommandLineParser parser(argc, argv, "{help h||}");
|
cv::CommandLineParser parser(argc, argv, "{help h||}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -10,12 +10,13 @@ using namespace std;
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout << "\n This program demonstrates how to use BLOB to detect and filter region \n"
|
cout << "\n This program demonstrates how to use BLOB to detect and filter region \n"
|
||||||
"Usage: \n"
|
<< "Usage: \n"
|
||||||
" ./detect_blob <image1(detect_blob.png as default)>\n"
|
<< argv[0]
|
||||||
"Press a key when image window is active to change descriptor";
|
<< " <image1(detect_blob.png as default)>\n"
|
||||||
|
<< "Press a key when image window is active to change descriptor";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -74,7 +75,7 @@ int main(int argc, char *argv[])
|
|||||||
cv::CommandLineParser parser(argc, argv, "{@input |detect_blob.png| }{h help | | }");
|
cv::CommandLineParser parser(argc, argv, "{@input |detect_blob.png| }{h help | | }");
|
||||||
if (parser.has("h"))
|
if (parser.has("h"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
fileName = parser.get<string>("@input");
|
fileName = parser.get<string>("@input");
|
||||||
@ -120,7 +121,7 @@ int main(int argc, char *argv[])
|
|||||||
uchar c3 = (uchar)rand();
|
uchar c3 = (uchar)rand();
|
||||||
palette.push_back(Vec3b(c1, c2, c3));
|
palette.push_back(Vec3b(c1, c2, c3));
|
||||||
}
|
}
|
||||||
help();
|
help(argv);
|
||||||
|
|
||||||
|
|
||||||
// These descriptors are going to be detecting and computing BLOBS with 6 different params
|
// These descriptors are going to be detecting and computing BLOBS with 6 different params
|
||||||
|
@ -34,13 +34,13 @@ using namespace std;
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout << "\nThis program demonstrates how to use MSER to detect extremal regions\n"
|
cout << "\nThis program demonstrates how to use MSER to detect extremal regions\n"
|
||||||
"Usage:\n"
|
"Usage:\n"
|
||||||
" ./detect_mser <image1(without parameter a synthetic image is used as default)>\n"
|
<< argv[0] << " <image1(without parameter a synthetic image is used as default)>\n"
|
||||||
"Press esc key when image window is active to change descriptor parameter\n"
|
"Press esc key when image window is active to change descriptor parameter\n"
|
||||||
"Press 2, 8, 4, 6, +, -, or 5 keys in openGL windows to change view or use mouse\n";
|
"Press 2, 8, 4, 6, +, -, or 5 keys in openGL windows to change view or use mouse\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
struct MSERParams
|
struct MSERParams
|
||||||
@ -405,7 +405,7 @@ int main(int argc, char *argv[])
|
|||||||
cv::CommandLineParser parser(argc, argv, "{ help h | | }{ @input | | }");
|
cv::CommandLineParser parser(argc, argv, "{ help h | | }{ @input | | }");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -431,7 +431,7 @@ int main(int argc, char *argv[])
|
|||||||
for (int i = 0; i<=numeric_limits<uint16_t>::max(); i++)
|
for (int i = 0; i<=numeric_limits<uint16_t>::max(); i++)
|
||||||
palette.push_back(Vec3b((uchar)rand(), (uchar)rand(), (uchar)rand()));
|
palette.push_back(Vec3b((uchar)rand(), (uchar)rand(), (uchar)rand()));
|
||||||
|
|
||||||
help();
|
help(argv);
|
||||||
|
|
||||||
MSERParams params;
|
MSERParams params;
|
||||||
|
|
||||||
|
@ -15,7 +15,7 @@ const int SZ = 20; // size of each digit is SZ x SZ
|
|||||||
const int CLASS_N = 10;
|
const int CLASS_N = 10;
|
||||||
const char* DIGITS_FN = "digits.png";
|
const char* DIGITS_FN = "digits.png";
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout <<
|
cout <<
|
||||||
"\n"
|
"\n"
|
||||||
@ -38,7 +38,7 @@ static void help()
|
|||||||
" http://www.robots.ox.ac.uk/~vgg/publications/2012/Arandjelovic12/arandjelovic12.pdf\n"
|
" http://www.robots.ox.ac.uk/~vgg/publications/2012/Arandjelovic12/arandjelovic12.pdf\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Usage:\n"
|
"Usage:\n"
|
||||||
" ./digits\n" << endl;
|
<< argv[0] << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void split2d(const Mat& image, const Size cell_size, vector<Mat>& cells)
|
static void split2d(const Mat& image, const Size cell_size, vector<Mat>& cells)
|
||||||
@ -299,9 +299,9 @@ static void shuffle(vector<Mat>& digits, vector<int>& labels)
|
|||||||
labels = shuffled_labels;
|
labels = shuffled_labels;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main(int /* argc */, char* argv[])
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
|
|
||||||
vector<Mat> digits;
|
vector<Mat> digits;
|
||||||
vector<int> labels;
|
vector<int> labels;
|
||||||
|
@ -87,11 +87,11 @@ static void onTrackbar( int, void* )
|
|||||||
imshow("Distance Map", dist8u );
|
imshow("Distance Map", dist8u );
|
||||||
}
|
}
|
||||||
|
|
||||||
static void help()
|
static void help(const char** argv)
|
||||||
{
|
{
|
||||||
printf("\nProgram to demonstrate the use of the distance transform function between edge images.\n"
|
printf("\nProgram to demonstrate the use of the distance transform function between edge images.\n"
|
||||||
"Usage:\n"
|
"Usage:\n"
|
||||||
"./distrans [image_name -- default image is stuff.jpg]\n"
|
"%s [image_name -- default image is stuff.jpg]\n"
|
||||||
"\nHot keys: \n"
|
"\nHot keys: \n"
|
||||||
"\tESC - quit the program\n"
|
"\tESC - quit the program\n"
|
||||||
"\tC - use C/Inf metric\n"
|
"\tC - use C/Inf metric\n"
|
||||||
@ -102,7 +102,7 @@ static void help()
|
|||||||
"\t0 - use precise distance transform\n"
|
"\t0 - use precise distance transform\n"
|
||||||
"\tv - switch to Voronoi diagram mode\n"
|
"\tv - switch to Voronoi diagram mode\n"
|
||||||
"\tp - switch to pixel-based Voronoi diagram mode\n"
|
"\tp - switch to pixel-based Voronoi diagram mode\n"
|
||||||
"\tSPACE - loop through all the modes\n\n");
|
"\tSPACE - loop through all the modes\n\n", argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* keys =
|
const char* keys =
|
||||||
@ -113,7 +113,7 @@ const char* keys =
|
|||||||
int main( int argc, const char** argv )
|
int main( int argc, const char** argv )
|
||||||
{
|
{
|
||||||
CommandLineParser parser(argc, argv, keys);
|
CommandLineParser parser(argc, argv, keys);
|
||||||
help();
|
help(argv);
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
return 0;
|
return 0;
|
||||||
string filename = parser.get<string>(0);
|
string filename = parser.get<string>(0);
|
||||||
@ -121,7 +121,7 @@ int main( int argc, const char** argv )
|
|||||||
if(gray.empty())
|
if(gray.empty())
|
||||||
{
|
{
|
||||||
printf("Cannot read image file: %s\n", filename.c_str());
|
printf("Cannot read image file: %s\n", filename.c_str());
|
||||||
help();
|
help(argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,11 +5,11 @@
|
|||||||
|
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
printf("\nThis program demonstrates OpenCV drawing and text output functions.\n"
|
printf("\nThis program demonstrates OpenCV drawing and text output functions.\n"
|
||||||
"Usage:\n"
|
"Usage:\n"
|
||||||
" ./drawing\n");
|
" %s\n", argv[0]);
|
||||||
}
|
}
|
||||||
static Scalar randomColor(RNG& rng)
|
static Scalar randomColor(RNG& rng)
|
||||||
{
|
{
|
||||||
@ -17,9 +17,9 @@ static Scalar randomColor(RNG& rng)
|
|||||||
return Scalar(icolor&255, (icolor>>8)&255, (icolor>>16)&255);
|
return Scalar(icolor&255, (icolor>>8)&255, (icolor>>16)&255);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main()
|
int main(int /* argc */, char** argv)
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
char wndname[] = "Drawing Demo";
|
char wndname[] = "Drawing Demo";
|
||||||
const int NUMBER = 100;
|
const int NUMBER = 100;
|
||||||
const int DELAY = 5;
|
const int DELAY = 5;
|
||||||
|
@ -39,11 +39,11 @@ static void onTrackbar(int, void*)
|
|||||||
imshow(window_name2, cedge);
|
imshow(window_name2, cedge);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void help()
|
static void help(const char** argv)
|
||||||
{
|
{
|
||||||
printf("\nThis sample demonstrates Canny edge detection\n"
|
printf("\nThis sample demonstrates Canny edge detection\n"
|
||||||
"Call:\n"
|
"Call:\n"
|
||||||
" /.edge [image_name -- Default is fruits.jpg]\n\n");
|
" %s [image_name -- Default is fruits.jpg]\n\n", argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* keys =
|
const char* keys =
|
||||||
@ -53,7 +53,7 @@ const char* keys =
|
|||||||
|
|
||||||
int main( int argc, const char** argv )
|
int main( int argc, const char** argv )
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
CommandLineParser parser(argc, argv, keys);
|
CommandLineParser parser(argc, argv, keys);
|
||||||
string filename = parser.get<string>(0);
|
string filename = parser.get<string>(0);
|
||||||
|
|
||||||
@ -61,7 +61,7 @@ int main( int argc, const char** argv )
|
|||||||
if(image.empty())
|
if(image.empty())
|
||||||
{
|
{
|
||||||
printf("Cannot read image file: %s\n", filename.c_str());
|
printf("Cannot read image file: %s\n", filename.c_str());
|
||||||
help();
|
help(argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
cedge.create(image.size(), image.type());
|
cedge.create(image.size(), image.type());
|
||||||
|
@ -7,19 +7,21 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
static void help()
|
static void help(const char** argv)
|
||||||
{
|
{
|
||||||
cout << "\nThis program demonstrates the use of cv::CascadeClassifier class to detect objects (Face + eyes). You can use Haar or LBP features.\n"
|
cout << "\nThis program demonstrates the use of cv::CascadeClassifier class to detect objects (Face + eyes). You can use Haar or LBP features.\n"
|
||||||
"This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.\n"
|
"This classifier can recognize many kinds of rigid objects, once the appropriate classifier is trained.\n"
|
||||||
"It's most known use is for faces.\n"
|
"It's most known use is for faces.\n"
|
||||||
"Usage:\n"
|
"Usage:\n"
|
||||||
"./facedetect [--cascade=<cascade_path> this is the primary trained classifier such as frontal face]\n"
|
<< argv[0]
|
||||||
" [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]\n"
|
<< " [--cascade=<cascade_path> this is the primary trained classifier such as frontal face]\n"
|
||||||
" [--scale=<image scale greater or equal to 1, try 1.3 for example>]\n"
|
" [--nested-cascade[=nested_cascade_path this an optional secondary classifier such as eyes]]\n"
|
||||||
" [--try-flip]\n"
|
" [--scale=<image scale greater or equal to 1, try 1.3 for example>]\n"
|
||||||
" [filename|camera_index]\n\n"
|
" [--try-flip]\n"
|
||||||
"see facedetect.cmd for one call:\n"
|
" [filename|camera_index]\n\n"
|
||||||
"./facedetect --cascade=\"data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"data/haarcascades/haarcascade_eye_tree_eyeglasses.xml\" --scale=1.3\n\n"
|
"example:\n"
|
||||||
|
<< argv[0]
|
||||||
|
<< " --cascade=\"data/haarcascades/haarcascade_frontalface_alt.xml\" --nested-cascade=\"data/haarcascades/haarcascade_eye_tree_eyeglasses.xml\" --scale=1.3\n\n"
|
||||||
"During execution:\n\tHit any key to quit.\n"
|
"During execution:\n\tHit any key to quit.\n"
|
||||||
"\tUsing OpenCV version " << CV_VERSION << "\n" << endl;
|
"\tUsing OpenCV version " << CV_VERSION << "\n" << endl;
|
||||||
}
|
}
|
||||||
@ -48,7 +50,7 @@ int main( int argc, const char** argv )
|
|||||||
);
|
);
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
cascadeName = parser.get<string>("cascade");
|
cascadeName = parser.get<string>("cascade");
|
||||||
@ -68,7 +70,7 @@ int main( int argc, const char** argv )
|
|||||||
if (!cascade.load(samples::findFile(cascadeName)))
|
if (!cascade.load(samples::findFile(cascadeName)))
|
||||||
{
|
{
|
||||||
cerr << "ERROR: Could not load classifier cascade" << endl;
|
cerr << "ERROR: Could not load classifier cascade" << endl;
|
||||||
help();
|
help(argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if( inputName.empty() || (isdigit(inputName[0]) && inputName.size() == 1) )
|
if( inputName.empty() || (isdigit(inputName[0]) && inputName.size() == 1) )
|
||||||
|
@ -19,7 +19,7 @@ using namespace std;
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
// Functions for facial feature detection
|
// Functions for facial feature detection
|
||||||
static void help();
|
static void help(char** argv);
|
||||||
static void detectFaces(Mat&, vector<Rect_<int> >&, string);
|
static void detectFaces(Mat&, vector<Rect_<int> >&, string);
|
||||||
static void detectEyes(Mat&, vector<Rect_<int> >&, string);
|
static void detectEyes(Mat&, vector<Rect_<int> >&, string);
|
||||||
static void detectNose(Mat&, vector<Rect_<int> >&, string);
|
static void detectNose(Mat&, vector<Rect_<int> >&, string);
|
||||||
@ -35,7 +35,7 @@ int main(int argc, char** argv)
|
|||||||
"{eyes||}{nose||}{mouth||}{help h||}{@image||}{@facexml||}");
|
"{eyes||}{nose||}{mouth||}{help h||}{@image||}{@facexml||}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
input_image_path = parser.get<string>("@image");
|
input_image_path = parser.get<string>("@image");
|
||||||
@ -63,14 +63,14 @@ int main(int argc, char** argv)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout << "\nThis file demonstrates facial feature points detection using Haarcascade classifiers.\n"
|
cout << "\nThis file demonstrates facial feature points detection using Haarcascade classifiers.\n"
|
||||||
"The program detects a face and eyes, nose and mouth inside the face."
|
"The program detects a face and eyes, nose and mouth inside the face."
|
||||||
"The code has been tested on the Japanese Female Facial Expression (JAFFE) database and found"
|
"The code has been tested on the Japanese Female Facial Expression (JAFFE) database and found"
|
||||||
"to give reasonably accurate results. \n";
|
"to give reasonably accurate results. \n";
|
||||||
|
|
||||||
cout << "\nUSAGE: ./cpp-example-facial_features [IMAGE] [FACE_CASCADE] [OPTIONS]\n"
|
cout << "\nUSAGE: " << argv[0] << " [IMAGE] [FACE_CASCADE] [OPTIONS]\n"
|
||||||
"IMAGE\n\tPath to the image of a face taken as input.\n"
|
"IMAGE\n\tPath to the image of a face taken as input.\n"
|
||||||
"FACE_CASCSDE\n\t Path to a haarcascade classifier for face detection.\n"
|
"FACE_CASCSDE\n\t Path to a haarcascade classifier for face detection.\n"
|
||||||
"OPTIONS: \nThere are 3 options available which are described in detail. There must be a "
|
"OPTIONS: \nThere are 3 options available which are described in detail. There must be a "
|
||||||
@ -81,11 +81,11 @@ static void help()
|
|||||||
|
|
||||||
|
|
||||||
cout << "EXAMPLE:\n"
|
cout << "EXAMPLE:\n"
|
||||||
"(1) ./cpp-example-facial_features image.jpg face.xml -eyes=eyes.xml -mouth=mouth.xml\n"
|
"(1) " << argv[0] << " image.jpg face.xml -eyes=eyes.xml -mouth=mouth.xml\n"
|
||||||
"\tThis will detect the face, eyes and mouth in image.jpg.\n"
|
"\tThis will detect the face, eyes and mouth in image.jpg.\n"
|
||||||
"(2) ./cpp-example-facial_features image.jpg face.xml -nose=nose.xml\n"
|
"(2) " << argv[0] << " image.jpg face.xml -nose=nose.xml\n"
|
||||||
"\tThis will detect the face and nose in image.jpg.\n"
|
"\tThis will detect the face and nose in image.jpg.\n"
|
||||||
"(3) ./cpp-example-facial_features image.jpg face.xml\n"
|
"(3) " << argv[0] << " image.jpg face.xml\n"
|
||||||
"\tThis will detect only the face in image.jpg.\n";
|
"\tThis will detect only the face in image.jpg.\n";
|
||||||
|
|
||||||
cout << " \n\nThe classifiers for face and eyes can be downloaded from : "
|
cout << " \n\nThe classifiers for face and eyes can be downloaded from : "
|
||||||
|
@ -8,14 +8,14 @@
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout <<
|
cout <<
|
||||||
"\nThis program demonstrates dense optical flow algorithm by Gunnar Farneback\n"
|
"\nThis program demonstrates dense optical flow algorithm by Gunnar Farneback\n"
|
||||||
"Mainly the function: calcOpticalFlowFarneback()\n"
|
"Mainly the function: calcOpticalFlowFarneback()\n"
|
||||||
"Call:\n"
|
"Call:\n"
|
||||||
"./fback\n"
|
<< argv[0]
|
||||||
"This reads from video camera 0\n" << endl;
|
<< "This reads from video camera 0\n" << endl;
|
||||||
}
|
}
|
||||||
static void drawOptFlowMap(const Mat& flow, Mat& cflowmap, int step,
|
static void drawOptFlowMap(const Mat& flow, Mat& cflowmap, int step,
|
||||||
double, const Scalar& color)
|
double, const Scalar& color)
|
||||||
@ -35,11 +35,11 @@ int main(int argc, char** argv)
|
|||||||
cv::CommandLineParser parser(argc, argv, "{help h||}");
|
cv::CommandLineParser parser(argc, argv, "{help h||}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
VideoCapture cap(0);
|
VideoCapture cap(0);
|
||||||
help();
|
help(argv);
|
||||||
if( !cap.isOpened() )
|
if( !cap.isOpened() )
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
@ -8,11 +8,12 @@
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout << "\nThis program demonstrated the floodFill() function\n"
|
cout << "\nThis program demonstrated the floodFill() function\n"
|
||||||
"Call:\n"
|
"Call:\n"
|
||||||
"./ffilldemo [image_name -- Default: fruits.jpg]\n" << endl;
|
<< argv[0]
|
||||||
|
<< " [image_name -- Default: fruits.jpg]\n" << endl;
|
||||||
|
|
||||||
cout << "Hot keys: \n"
|
cout << "Hot keys: \n"
|
||||||
"\tESC - quit the program\n"
|
"\tESC - quit the program\n"
|
||||||
@ -90,7 +91,7 @@ int main( int argc, char** argv )
|
|||||||
parser.printMessage();
|
parser.printMessage();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
help();
|
help(argv);
|
||||||
image0.copyTo(image);
|
image0.copyTo(image);
|
||||||
cvtColor(image0, gray, COLOR_BGR2GRAY);
|
cvtColor(image0, gray, COLOR_BGR2GRAY);
|
||||||
mask.create(image0.rows+2, image0.cols+2, CV_8UC1);
|
mask.create(image0.rows+2, image0.cols+2, CV_8UC1);
|
||||||
|
@ -164,14 +164,13 @@ public:
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout <<
|
cout << "\nThis program is demonstration for ellipse fitting. The program finds\n"
|
||||||
"\nThis program is demonstration for ellipse fitting. The program finds\n"
|
"contours and approximate it by ellipses. Three methods are used to find the \n"
|
||||||
"contours and approximate it by ellipses. Three methods are used to find the \n"
|
"elliptical fits: fitEllipse, fitEllipseAMS and fitEllipseDirect.\n"
|
||||||
"elliptical fits: fitEllipse, fitEllipseAMS and fitEllipseDirect.\n"
|
"Call:\n"
|
||||||
"Call:\n"
|
<< argv[0] << " [image_name -- Default ellipses.jpg]\n" << endl;
|
||||||
"./fitellipse [image_name -- Default ellipses.jpg]\n" << endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int sliderPos = 70;
|
int sliderPos = 70;
|
||||||
@ -195,7 +194,7 @@ int main( int argc, char** argv )
|
|||||||
cv::CommandLineParser parser(argc, argv,"{help h||}{@image|ellipses.jpg|}");
|
cv::CommandLineParser parser(argc, argv,"{help h||}{@image|ellipses.jpg|}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
string filename = parser.get<string>("@image");
|
string filename = parser.get<string>("@image");
|
||||||
|
@ -7,25 +7,25 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout << "\nThis program demonstrates GrabCut segmentation -- select an object in a region\n"
|
cout << "\nThis program demonstrates GrabCut segmentation -- select an object in a region\n"
|
||||||
"and then grabcut will attempt to segment it out.\n"
|
"and then grabcut will attempt to segment it out.\n"
|
||||||
"Call:\n"
|
"Call:\n"
|
||||||
"./grabcut <image_name>\n"
|
<< argv[0] << " <image_name>\n"
|
||||||
"\nSelect a rectangular area around the object you want to segment\n" <<
|
"\nSelect a rectangular area around the object you want to segment\n" <<
|
||||||
"\nHot keys: \n"
|
"\nHot keys: \n"
|
||||||
"\tESC - quit the program\n"
|
"\tESC - quit the program\n"
|
||||||
"\tr - restore the original image\n"
|
"\tr - restore the original image\n"
|
||||||
"\tn - next iteration\n"
|
"\tn - next iteration\n"
|
||||||
"\n"
|
"\n"
|
||||||
"\tleft mouse button - set rectangle\n"
|
"\tleft mouse button - set rectangle\n"
|
||||||
"\n"
|
"\n"
|
||||||
"\tCTRL+left mouse button - set GC_BGD pixels\n"
|
"\tCTRL+left mouse button - set GC_BGD pixels\n"
|
||||||
"\tSHIFT+left mouse button - set GC_FGD pixels\n"
|
"\tSHIFT+left mouse button - set GC_FGD pixels\n"
|
||||||
"\n"
|
"\n"
|
||||||
"\tCTRL+right mouse button - set GC_PR_BGD pixels\n"
|
"\tCTRL+right mouse button - set GC_PR_BGD pixels\n"
|
||||||
"\tSHIFT+right mouse button - set GC_PR_FGD pixels\n" << endl;
|
"\tSHIFT+right mouse button - set GC_PR_FGD pixels\n" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
const Scalar RED = Scalar(0,0,255);
|
const Scalar RED = Scalar(0,0,255);
|
||||||
@ -277,7 +277,7 @@ static void on_mouse( int event, int x, int y, int flags, void* param )
|
|||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
cv::CommandLineParser parser(argc, argv, "{@input| messi5.jpg |}");
|
cv::CommandLineParser parser(argc, argv, "{@input| messi5.jpg |}");
|
||||||
help();
|
help(argv);
|
||||||
|
|
||||||
string filename = parser.get<string>("@input");
|
string filename = parser.get<string>("@input");
|
||||||
if( filename.empty() )
|
if( filename.empty() )
|
||||||
|
@ -28,7 +28,7 @@
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static void help(void);
|
static void help(const char** argv);
|
||||||
static int readWarp(string iFilename, Mat& warp, int motionType);
|
static int readWarp(string iFilename, Mat& warp, int motionType);
|
||||||
static int saveWarp(string fileName, const Mat& warp, int motionType);
|
static int saveWarp(string fileName, const Mat& warp, int motionType);
|
||||||
static void draw_warped_roi(Mat& image, const int width, const int height, Mat& W);
|
static void draw_warped_roi(Mat& image, const int width, const int height, Mat& W);
|
||||||
@ -57,7 +57,7 @@ const std::string keys =
|
|||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
static void help(void)
|
static void help(const char** argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
cout << "\nThis file demonstrates the use of the ECC image alignment algorithm. When one image"
|
cout << "\nThis file demonstrates the use of the ECC image alignment algorithm. When one image"
|
||||||
@ -65,10 +65,14 @@ static void help(void)
|
|||||||
" are given, the initialization of the warp by command line parsing is possible. "
|
" are given, the initialization of the warp by command line parsing is possible. "
|
||||||
"If inputWarp is missing, the identity transformation initializes the algorithm. \n" << endl;
|
"If inputWarp is missing, the identity transformation initializes the algorithm. \n" << endl;
|
||||||
|
|
||||||
cout << "\nUsage example (one image): \n./image_alignment fruits.jpg -o=outWarp.ecc "
|
cout << "\nUsage example (one image): \n"
|
||||||
"-m=euclidean -e=1e-6 -N=70 -v=1 \n" << endl;
|
<< argv[0]
|
||||||
|
<< " fruits.jpg -o=outWarp.ecc "
|
||||||
|
"-m=euclidean -e=1e-6 -N=70 -v=1 \n" << endl;
|
||||||
|
|
||||||
cout << "\nUsage example (two images with initialization): \n./image_alignment yourInput.png yourTemplate.png "
|
cout << "\nUsage example (two images with initialization): \n"
|
||||||
|
<< argv[0]
|
||||||
|
<< " yourInput.png yourTemplate.png "
|
||||||
"yourInitialWarp.ecc -o=outWarp.ecc -m=homography -e=1e-6 -N=70 -v=1 -w=yourFinalImage.png \n" << endl;
|
"yourInitialWarp.ecc -o=outWarp.ecc -m=homography -e=1e-6 -N=70 -v=1 -w=yourFinalImage.png \n" << endl;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -178,7 +182,7 @@ int main (const int argc, const char * argv[])
|
|||||||
parser.about("ECC demo");
|
parser.about("ECC demo");
|
||||||
|
|
||||||
parser.printMessage();
|
parser.printMessage();
|
||||||
help();
|
help(argv);
|
||||||
|
|
||||||
string imgFile = parser.get<string>(0);
|
string imgFile = parser.get<string>(0);
|
||||||
string tempImgFile = parser.get<string>(1);
|
string tempImgFile = parser.get<string>(1);
|
||||||
|
@ -9,13 +9,13 @@
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
cout <<
|
cout <<
|
||||||
"\nThis program demonstrates Laplace point/edge detection using OpenCV function Laplacian()\n"
|
"\nThis program demonstrates Laplace point/edge detection using OpenCV function Laplacian()\n"
|
||||||
"It captures from the camera of your choice: 0, 1, ... default 0\n"
|
"It captures from the camera of your choice: 0, 1, ... default 0\n"
|
||||||
"Call:\n"
|
"Call:\n"
|
||||||
"./laplace -c=<camera #, default 0> -p=<index of the frame to be decoded/captured next>\n" << endl;
|
<< argv[0] << " -c=<camera #, default 0> -p=<index of the frame to be decoded/captured next>\n" << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {GAUSSIAN, BLUR, MEDIAN};
|
enum {GAUSSIAN, BLUR, MEDIAN};
|
||||||
@ -26,7 +26,7 @@ int smoothType = GAUSSIAN;
|
|||||||
int main( int argc, char** argv )
|
int main( int argc, char** argv )
|
||||||
{
|
{
|
||||||
cv::CommandLineParser parser(argc, argv, "{ c | 0 | }{ p | | }");
|
cv::CommandLineParser parser(argc, argv, "{ c | 0 | }{ p | | }");
|
||||||
help();
|
help(argv);
|
||||||
|
|
||||||
VideoCapture cap;
|
VideoCapture cap;
|
||||||
string camera = parser.get<string>("c");
|
string camera = parser.get<string>("c");
|
||||||
|
@ -9,7 +9,7 @@ using namespace std;
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace cv::ml;
|
using namespace cv::ml;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
printf("\nThe sample demonstrates how to train Random Trees classifier\n"
|
printf("\nThe sample demonstrates how to train Random Trees classifier\n"
|
||||||
"(or Boosting classifier, or MLP, or Knearest, or Nbayes, or Support Vector Machines - see main()) using the provided dataset.\n"
|
"(or Boosting classifier, or MLP, or Knearest, or Nbayes, or Support Vector Machines - see main()) using the provided dataset.\n"
|
||||||
@ -28,10 +28,10 @@ static void help()
|
|||||||
"and the remaining 4000 (10000 for boosting) - to test the classifier.\n"
|
"and the remaining 4000 (10000 for boosting) - to test the classifier.\n"
|
||||||
"======================================================\n");
|
"======================================================\n");
|
||||||
printf("\nThis is letter recognition sample.\n"
|
printf("\nThis is letter recognition sample.\n"
|
||||||
"The usage: letter_recog [-data=<path to letter-recognition.data>] \\\n"
|
"The usage: %s [-data=<path to letter-recognition.data>] \\\n"
|
||||||
" [-save=<output XML file for the classifier>] \\\n"
|
" [-save=<output XML file for the classifier>] \\\n"
|
||||||
" [-load=<XML file with the pre-trained classifier>] \\\n"
|
" [-load=<XML file with the pre-trained classifier>] \\\n"
|
||||||
" [-boost|-mlp|-knearest|-nbayes|-svm] # to use boost/mlp/knearest/SVM classifier instead of default Random Trees\n" );
|
" [-boost|-mlp|-knearest|-nbayes|-svm] # to use boost/mlp/knearest/SVM classifier instead of default Random Trees\n", argv[0] );
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function reads data and responses from the file <filename>
|
// This function reads data and responses from the file <filename>
|
||||||
@ -538,7 +538,7 @@ int main( int argc, char *argv[] )
|
|||||||
else if (parser.has("svm"))
|
else if (parser.has("svm"))
|
||||||
method = 5;
|
method = 5;
|
||||||
|
|
||||||
help();
|
help(argv);
|
||||||
|
|
||||||
if( (method == 0 ?
|
if( (method == 0 ?
|
||||||
build_rtrees_classifier( data_filename, filename_to_save, filename_to_load ) :
|
build_rtrees_classifier( data_filename, filename_to_save, filename_to_load ) :
|
||||||
|
@ -8,11 +8,11 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
static void help()
|
static void help(char* argv[])
|
||||||
{
|
{
|
||||||
cout << "\n This program demonstrates how to detect compute and match ORB BRISK and AKAZE descriptors \n"
|
cout << "\n This program demonstrates how to detect compute and match ORB BRISK and AKAZE descriptors \n"
|
||||||
"Usage: \n"
|
"Usage: \n "
|
||||||
" ./matchmethod_orb_akaze_brisk --image1=<image1(basketball1.png as default)> --image2=<image2(basketball2.png as default)>\n"
|
<< argv[0] << " --image1=<image1(basketball1.png as default)> --image2=<image2(basketball2.png as default)>\n"
|
||||||
"Press a key when image window is active to change algorithm or descriptor";
|
"Press a key when image window is active to change algorithm or descriptor";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ int main(int argc, char *argv[])
|
|||||||
"{help h ||}");
|
"{help h ||}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
fileName.push_back(samples::findFile(parser.get<string>(0)));
|
fileName.push_back(samples::findFile(parser.get<string>(0)));
|
||||||
|
@ -7,12 +7,12 @@
|
|||||||
|
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
|
|
||||||
printf("\nShow off image morphology: erosion, dialation, open and close\n"
|
printf("\nShow off image morphology: erosion, dialation, open and close\n"
|
||||||
"Call:\n morphology2 [image]\n"
|
"Call:\n %s [image]\n"
|
||||||
"This program also shows use of rect, ellipse and cross kernels\n\n");
|
"This program also shows use of rect, ellipse and cross kernels\n\n", argv[0]);
|
||||||
printf( "Hot keys: \n"
|
printf( "Hot keys: \n"
|
||||||
"\tESC - quit the program\n"
|
"\tESC - quit the program\n"
|
||||||
"\tr - use rectangle structuring element\n"
|
"\tr - use rectangle structuring element\n"
|
||||||
@ -62,13 +62,13 @@ int main( int argc, char** argv )
|
|||||||
cv::CommandLineParser parser(argc, argv, "{help h||}{ @image | baboon.jpg | }");
|
cv::CommandLineParser parser(argc, argv, "{help h||}{ @image | baboon.jpg | }");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
std::string filename = samples::findFile(parser.get<std::string>("@image"));
|
std::string filename = samples::findFile(parser.get<std::string>("@image"));
|
||||||
if( (src = imread(filename,IMREAD_COLOR)).empty() )
|
if( (src = imread(filename,IMREAD_COLOR)).empty() )
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,14 +8,14 @@
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
printf("\n"
|
printf("\n"
|
||||||
"This program demonstrated a simple method of connected components clean up of background subtraction\n"
|
"This program demonstrated a simple method of connected components clean up of background subtraction\n"
|
||||||
"When the program starts, it begins learning the background.\n"
|
"When the program starts, it begins learning the background.\n"
|
||||||
"You can toggle background learning on and off by hitting the space bar.\n"
|
"You can toggle background learning on and off by hitting the space bar.\n"
|
||||||
"Call\n"
|
"Call\n"
|
||||||
"./segment_objects [video file, else it reads camera 0]\n\n");
|
"%s [video file, else it reads camera 0]\n\n", argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void refineSegments(const Mat& img, Mat& mask, Mat& dst)
|
static void refineSegments(const Mat& img, Mat& mask, Mat& dst)
|
||||||
@ -66,7 +66,7 @@ int main(int argc, char** argv)
|
|||||||
CommandLineParser parser(argc, argv, "{help h||}{@input||}");
|
CommandLineParser parser(argc, argv, "{help h||}{@input||}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
string input = parser.get<std::string>("@input");
|
string input = parser.get<std::string>("@input");
|
||||||
|
@ -19,48 +19,51 @@
|
|||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
const char* helphelp =
|
static string helphelp(char** argv)
|
||||||
"\nThis program's purpose is to collect data sets of an object and its segmentation mask.\n"
|
{
|
||||||
"\n"
|
return string("\nThis program's purpose is to collect data sets of an object and its segmentation mask.\n")
|
||||||
"It shows how to use a calibrated camera together with a calibration pattern to\n"
|
+ "\n"
|
||||||
"compute the homography of the plane the calibration pattern is on. It also shows grabCut\n"
|
"It shows how to use a calibrated camera together with a calibration pattern to\n"
|
||||||
"segmentation etc.\n"
|
"compute the homography of the plane the calibration pattern is on. It also shows grabCut\n"
|
||||||
"\n"
|
"segmentation etc.\n"
|
||||||
"select3dobj -w=<board_width> -h=<board_height> [-s=<square_size>]\n"
|
"\n"
|
||||||
" -i=<camera_intrinsics_filename> -o=<output_prefix>\n"
|
+ argv[0]
|
||||||
"\n"
|
+ " -w=<board_width> -h=<board_height> [-s=<square_size>]\n"
|
||||||
" -w=<board_width> Number of chessboard corners wide\n"
|
" -i=<camera_intrinsics_filename> -o=<output_prefix>\n"
|
||||||
" -h=<board_height> Number of chessboard corners width\n"
|
"\n"
|
||||||
" [-s=<square_size>] Optional measure of chessboard squares in meters\n"
|
" -w=<board_width> Number of chessboard corners wide\n"
|
||||||
" -i=<camera_intrinsics_filename> Camera matrix .yml file from calibration.cpp\n"
|
" -h=<board_height> Number of chessboard corners width\n"
|
||||||
" -o=<output_prefix> Prefix the output segmentation images with this\n"
|
" [-s=<square_size>] Optional measure of chessboard squares in meters\n"
|
||||||
" [video_filename/cameraId] If present, read from that video file or that ID\n"
|
" -i=<camera_intrinsics_filename> Camera matrix .yml file from calibration.cpp\n"
|
||||||
"\n"
|
" -o=<output_prefix> Prefix the output segmentation images with this\n"
|
||||||
"Using a camera's intrinsics (from calibrating a camera -- see calibration.cpp) and an\n"
|
" [video_filename/cameraId] If present, read from that video file or that ID\n"
|
||||||
"image of the object sitting on a planar surface with a calibration pattern of\n"
|
"\n"
|
||||||
"(board_width x board_height) on the surface, we draw a 3D box around the object. From\n"
|
"Using a camera's intrinsics (from calibrating a camera -- see calibration.cpp) and an\n"
|
||||||
"then on, we can move a camera and as long as it sees the chessboard calibration pattern,\n"
|
"image of the object sitting on a planar surface with a calibration pattern of\n"
|
||||||
"it will store a mask of where the object is. We get successive images using <output_prefix>\n"
|
"(board_width x board_height) on the surface, we draw a 3D box around the object. From\n"
|
||||||
"of the segmentation mask containing the object. This makes creating training sets easy.\n"
|
"then on, we can move a camera and as long as it sees the chessboard calibration pattern,\n"
|
||||||
"It is best if the chessboard is odd x even in dimensions to avoid ambiguous poses.\n"
|
"it will store a mask of where the object is. We get successive images using <output_prefix>\n"
|
||||||
"\n"
|
"of the segmentation mask containing the object. This makes creating training sets easy.\n"
|
||||||
"The actions one can use while the program is running are:\n"
|
"It is best if the chessboard is odd x even in dimensions to avoid ambiguous poses.\n"
|
||||||
"\n"
|
"\n"
|
||||||
" Select object as 3D box with the mouse.\n"
|
"The actions one can use while the program is running are:\n"
|
||||||
" First draw one line on the plane to outline the projection of that object on the plane\n"
|
"\n"
|
||||||
" Then extend that line into a box to encompass the projection of that object onto the plane\n"
|
" Select object as 3D box with the mouse.\n"
|
||||||
" The use the mouse again to extend the box upwards from the plane to encase the object.\n"
|
" First draw one line on the plane to outline the projection of that object on the plane\n"
|
||||||
" Then use the following commands\n"
|
" Then extend that line into a box to encompass the projection of that object onto the plane\n"
|
||||||
" ESC - Reset the selection\n"
|
" The use the mouse again to extend the box upwards from the plane to encase the object.\n"
|
||||||
" SPACE - Skip the frame; move to the next frame (not in video mode)\n"
|
" Then use the following commands\n"
|
||||||
" ENTER - Confirm the selection. Grab next object in video mode.\n"
|
" ESC - Reset the selection\n"
|
||||||
" q - Exit the program\n"
|
" SPACE - Skip the frame; move to the next frame (not in video mode)\n"
|
||||||
"\n\n";
|
" ENTER - Confirm the selection. Grab next object in video mode.\n"
|
||||||
|
" q - Exit the program\n"
|
||||||
|
"\n\n";
|
||||||
|
}
|
||||||
// static void help()
|
// static void help()
|
||||||
// {
|
// {
|
||||||
// puts(helphelp);
|
// puts(helphelp);
|
||||||
@ -384,7 +387,7 @@ static bool readStringList( const string& filename, vector<string>& l )
|
|||||||
|
|
||||||
int main(int argc, char** argv)
|
int main(int argc, char** argv)
|
||||||
{
|
{
|
||||||
const char* help = "Usage: select3dobj -w=<board_width> -h=<board_height> [-s=<square_size>]\n"
|
string help = string("Usage: ") + argv[0] + " -w=<board_width> -h=<board_height> [-s=<square_size>]\n" +
|
||||||
"\t-i=<intrinsics_filename> -o=<output_prefix> [video_filename/cameraId]\n";
|
"\t-i=<intrinsics_filename> -o=<output_prefix> [video_filename/cameraId]\n";
|
||||||
const char* screen_help =
|
const char* screen_help =
|
||||||
"Actions: \n"
|
"Actions: \n"
|
||||||
@ -397,8 +400,8 @@ int main(int argc, char** argv)
|
|||||||
cv::CommandLineParser parser(argc, argv, "{help h||}{w||}{h||}{s|1|}{i||}{o||}{@input|0|}");
|
cv::CommandLineParser parser(argc, argv, "{help h||}{w||}{h||}{s|1|}{i||}{o||}{@input|0|}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
puts(helphelp);
|
puts(helphelp(argv).c_str());
|
||||||
puts(help);
|
puts(help.c_str());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
string intrinsicsFilename;
|
string intrinsicsFilename;
|
||||||
@ -419,26 +422,26 @@ int main(int argc, char** argv)
|
|||||||
inputName = samples::findFileOrKeep(parser.get<string>("@input"));
|
inputName = samples::findFileOrKeep(parser.get<string>("@input"));
|
||||||
if (!parser.check())
|
if (!parser.check())
|
||||||
{
|
{
|
||||||
puts(help);
|
puts(help.c_str());
|
||||||
parser.printErrors();
|
parser.printErrors();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ( boardSize.width <= 0 )
|
if ( boardSize.width <= 0 )
|
||||||
{
|
{
|
||||||
printf("Incorrect -w parameter (must be a positive integer)\n");
|
printf("Incorrect -w parameter (must be a positive integer)\n");
|
||||||
puts(help);
|
puts(help.c_str());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ( boardSize.height <= 0 )
|
if ( boardSize.height <= 0 )
|
||||||
{
|
{
|
||||||
printf("Incorrect -h parameter (must be a positive integer)\n");
|
printf("Incorrect -h parameter (must be a positive integer)\n");
|
||||||
puts(help);
|
puts(help.c_str());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if ( squareSize <= 0 )
|
if ( squareSize <= 0 )
|
||||||
{
|
{
|
||||||
printf("Incorrect -s parameter (must be a positive real number)\n");
|
printf("Incorrect -s parameter (must be a positive real number)\n");
|
||||||
puts(help);
|
puts(help.c_str());
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
Mat cameraMatrix, distCoeffs;
|
Mat cameraMatrix, distCoeffs;
|
||||||
|
@ -38,7 +38,7 @@
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
static int print_help()
|
static int print_help(char** argv)
|
||||||
{
|
{
|
||||||
cout <<
|
cout <<
|
||||||
" Given a list of chessboard images, the number of corners (nx, ny)\n"
|
" Given a list of chessboard images, the number of corners (nx, ny)\n"
|
||||||
@ -49,7 +49,7 @@ static int print_help()
|
|||||||
" matrix separately) stereo. \n"
|
" matrix separately) stereo. \n"
|
||||||
" Calibrate the cameras and display the\n"
|
" Calibrate the cameras and display the\n"
|
||||||
" rectified results along with the computed disparity images. \n" << endl;
|
" rectified results along with the computed disparity images. \n" << endl;
|
||||||
cout << "Usage:\n ./stereo_calib -w=<board_width default=9> -h=<board_height default=6> -s=<square_size default=1.0> <image list XML/YML file default=stereo_calib.xml>\n" << endl;
|
cout << "Usage:\n " << argv[0] << " -w=<board_width default=9> -h=<board_height default=6> -s=<square_size default=1.0> <image list XML/YML file default=stereo_calib.xml>\n" << endl;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,7 +348,7 @@ int main(int argc, char** argv)
|
|||||||
bool showRectified;
|
bool showRectified;
|
||||||
cv::CommandLineParser parser(argc, argv, "{w|9|}{h|6|}{s|1.0|}{nr||}{help||}{@input|stereo_calib.xml|}");
|
cv::CommandLineParser parser(argc, argv, "{w|9|}{h|6|}{s|1.0|}{nr||}{help||}{@input|stereo_calib.xml|}");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
return print_help();
|
return print_help(argv);
|
||||||
showRectified = !parser.has("nr");
|
showRectified = !parser.has("nr");
|
||||||
imagelistfn = samples::findFile(parser.get<string>("@input"));
|
imagelistfn = samples::findFile(parser.get<string>("@input"));
|
||||||
boardSize.width = parser.get<int>("w");
|
boardSize.width = parser.get<int>("w");
|
||||||
@ -364,7 +364,7 @@ int main(int argc, char** argv)
|
|||||||
if(!ok || imagelist.empty())
|
if(!ok || imagelist.empty())
|
||||||
{
|
{
|
||||||
cout << "can not open " << imagelistfn << " or the string list is empty" << endl;
|
cout << "can not open " << imagelistfn << " or the string list is empty" << endl;
|
||||||
return print_help();
|
return print_help(argv);
|
||||||
}
|
}
|
||||||
|
|
||||||
StereoCalib(imagelist, boardSize, squareSize, false, true, showRectified);
|
StereoCalib(imagelist, boardSize, squareSize, false, true, showRectified);
|
||||||
|
@ -17,12 +17,12 @@
|
|||||||
|
|
||||||
using namespace cv;
|
using namespace cv;
|
||||||
|
|
||||||
static void print_help()
|
static void print_help(char** argv)
|
||||||
{
|
{
|
||||||
printf("\nDemo stereo matching converting L and R images into disparity and point clouds\n");
|
printf("\nDemo stereo matching converting L and R images into disparity and point clouds\n");
|
||||||
printf("\nUsage: stereo_match <left_image> <right_image> [--algorithm=bm|sgbm|hh|sgbm3way] [--blocksize=<block_size>]\n"
|
printf("\nUsage: %s <left_image> <right_image> [--algorithm=bm|sgbm|hh|sgbm3way] [--blocksize=<block_size>]\n"
|
||||||
"[--max-disparity=<max_disparity>] [--scale=scale_factor>] [-i=<intrinsic_filename>] [-e=<extrinsic_filename>]\n"
|
"[--max-disparity=<max_disparity>] [--scale=scale_factor>] [-i=<intrinsic_filename>] [-e=<extrinsic_filename>]\n"
|
||||||
"[--no-display] [-o=<disparity_image>] [-p=<point_cloud_file>]\n");
|
"[--no-display] [-o=<disparity_image>] [-p=<point_cloud_file>]\n", argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void saveXYZ(const char* filename, const Mat& mat)
|
static void saveXYZ(const char* filename, const Mat& mat)
|
||||||
@ -62,7 +62,7 @@ int main(int argc, char** argv)
|
|||||||
"{@arg1||}{@arg2||}{help h||}{algorithm||}{max-disparity|0|}{blocksize|0|}{no-display||}{scale|1|}{i||}{e||}{o||}{p||}");
|
"{@arg1||}{@arg2||}{help h||}{algorithm||}{max-disparity|0|}{blocksize|0|}{no-display||}{scale|1|}{i||}{e||}{o||}{p||}");
|
||||||
if(parser.has("help"))
|
if(parser.has("help"))
|
||||||
{
|
{
|
||||||
print_help();
|
print_help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
img1_filename = samples::findFile(parser.get<std::string>(0));
|
img1_filename = samples::findFile(parser.get<std::string>(0));
|
||||||
@ -96,13 +96,13 @@ int main(int argc, char** argv)
|
|||||||
if( alg < 0 )
|
if( alg < 0 )
|
||||||
{
|
{
|
||||||
printf("Command-line parameter error: Unknown stereo algorithm\n\n");
|
printf("Command-line parameter error: Unknown stereo algorithm\n\n");
|
||||||
print_help();
|
print_help(argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if ( numberOfDisparities < 1 || numberOfDisparities % 16 != 0 )
|
if ( numberOfDisparities < 1 || numberOfDisparities % 16 != 0 )
|
||||||
{
|
{
|
||||||
printf("Command-line parameter error: The max disparity (--maxdisparity=<...>) must be a positive integer divisible by 16\n");
|
printf("Command-line parameter error: The max disparity (--maxdisparity=<...>) must be a positive integer divisible by 16\n");
|
||||||
print_help();
|
print_help(argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (scale < 0)
|
if (scale < 0)
|
||||||
|
@ -29,11 +29,11 @@ using namespace std;
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace cv::detail;
|
using namespace cv::detail;
|
||||||
|
|
||||||
static void printUsage()
|
static void printUsage(char** argv)
|
||||||
{
|
{
|
||||||
cout <<
|
cout <<
|
||||||
"Rotation model images stitcher.\n\n"
|
"Rotation model images stitcher.\n\n"
|
||||||
"stitching_detailed img1 img2 [...imgN] [flags]\n\n"
|
<< argv[0] << " img1 img2 [...imgN] [flags]\n\n"
|
||||||
"Flags:\n"
|
"Flags:\n"
|
||||||
" --preview\n"
|
" --preview\n"
|
||||||
" Run stitching in the preview mode. Works faster than usual mode,\n"
|
" Run stitching in the preview mode. Works faster than usual mode,\n"
|
||||||
@ -147,14 +147,14 @@ static int parseCmdArgs(int argc, char** argv)
|
|||||||
{
|
{
|
||||||
if (argc == 1)
|
if (argc == 1)
|
||||||
{
|
{
|
||||||
printUsage();
|
printUsage(argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
for (int i = 1; i < argc; ++i)
|
for (int i = 1; i < argc; ++i)
|
||||||
{
|
{
|
||||||
if (string(argv[i]) == "--help" || string(argv[i]) == "/?")
|
if (string(argv[i]) == "--help" || string(argv[i]) == "/?")
|
||||||
{
|
{
|
||||||
printUsage();
|
printUsage(argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
else if (string(argv[i]) == "--preview")
|
else if (string(argv[i]) == "--preview")
|
||||||
|
@ -8,14 +8,14 @@
|
|||||||
using namespace cv;
|
using namespace cv;
|
||||||
using namespace cv::ml;
|
using namespace cv::ml;
|
||||||
|
|
||||||
static void help()
|
static void help(char** argv)
|
||||||
{
|
{
|
||||||
printf(
|
printf(
|
||||||
"\nThis sample demonstrates how to use different decision trees and forests including boosting and random trees.\n"
|
"\nThis sample demonstrates how to use different decision trees and forests including boosting and random trees.\n"
|
||||||
"Usage:\n\t./tree_engine [-r=<response_column>] [-ts=type_spec] <csv filename>\n"
|
"Usage:\n\t%s [-r=<response_column>] [-ts=type_spec] <csv filename>\n"
|
||||||
"where -r=<response_column> specified the 0-based index of the response (0 by default)\n"
|
"where -r=<response_column> specified the 0-based index of the response (0 by default)\n"
|
||||||
"-ts= specifies the var type spec in the form ord[n1,n2-n3,n4-n5,...]cat[m1-m2,m3,m4-m5,...]\n"
|
"-ts= specifies the var type spec in the form ord[n1,n2-n3,n4-n5,...]cat[m1-m2,m3,m4-m5,...]\n"
|
||||||
"<csv filename> is the name of training data file in comma-separated value format\n\n");
|
"<csv filename> is the name of training data file in comma-separated value format\n\n", argv[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void train_and_print_errs(Ptr<StatModel> model, const Ptr<TrainData>& data)
|
static void train_and_print_errs(Ptr<StatModel> model, const Ptr<TrainData>& data)
|
||||||
@ -37,7 +37,7 @@ int main(int argc, char** argv)
|
|||||||
cv::CommandLineParser parser(argc, argv, "{ help h | | }{r | 0 | }{ts | | }{@input | | }");
|
cv::CommandLineParser parser(argc, argv, "{ help h | | }{r | 0 | }{ts | | }{@input | | }");
|
||||||
if (parser.has("help"))
|
if (parser.has("help"))
|
||||||
{
|
{
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
std::string filename = parser.get<std::string>("@input");
|
std::string filename = parser.get<std::string>("@input");
|
||||||
@ -48,7 +48,7 @@ int main(int argc, char** argv)
|
|||||||
if( filename.empty() || !parser.check() )
|
if( filename.empty() || !parser.check() )
|
||||||
{
|
{
|
||||||
parser.printErrors();
|
parser.printErrors();
|
||||||
help();
|
help(argv);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
printf("\nReading in %s...\n\n",filename.c_str());
|
printf("\nReading in %s...\n\n",filename.c_str());
|
||||||
|
Loading…
Reference in New Issue
Block a user