Merge pull request #12570 from alalek:drop_usrtype1

* core: drop usage of CV_USRTYPE1 in OpenCV

avoid OpenCV crashes due size change CV_ELEM_SIZE(CV_USRTYPE1): 8 -> 2

* ! fix persistence internal types
This commit is contained in:
Alexander Alekhin
2018-09-19 13:55:26 +03:00
committed by GitHub
parent 861415133e
commit 5fb0f34e8a
13 changed files with 141 additions and 112 deletions
+82 -65
View File
@@ -40,6 +40,7 @@
//M*/
#include "precomp.hpp"
#include "opencv2/flann/miniflann.hpp"
#include <limits>
#include "opencl_kernels_features2d.hpp"
@@ -1167,6 +1168,8 @@ void FlannBasedMatcher::train()
}
}
using namespace cv::flann;
void FlannBasedMatcher::read( const FileNode& fn)
{
if (!indexParams)
@@ -1179,32 +1182,34 @@ void FlannBasedMatcher::read( const FileNode& fn)
{
CV_Assert(ip[i].type() == FileNode::MAP);
String _name = (String)ip[i]["name"];
int type = (int)ip[i]["type"];
FlannIndexType type = (FlannIndexType)(int)ip[i]["type"];
CV_CheckLE((int)type, (int)LAST_VALUE_FLANN_INDEX_TYPE, "");
switch(type)
{
case CV_8U:
case CV_8S:
case CV_16U:
case CV_16S:
case CV_32S:
case FLANN_INDEX_TYPE_8U:
case FLANN_INDEX_TYPE_8S:
case FLANN_INDEX_TYPE_16U:
case FLANN_INDEX_TYPE_16S:
case FLANN_INDEX_TYPE_32S:
indexParams->setInt(_name, (int) ip[i]["value"]);
break;
case CV_32F:
case FLANN_INDEX_TYPE_32F:
indexParams->setFloat(_name, (float) ip[i]["value"]);
break;
case CV_64F:
case FLANN_INDEX_TYPE_64F:
indexParams->setDouble(_name, (double) ip[i]["value"]);
break;
case CV_USRTYPE1:
case FLANN_INDEX_TYPE_STRING:
indexParams->setString(_name, (String) ip[i]["value"]);
break;
case CV_MAKETYPE(CV_USRTYPE1,2):
case FLANN_INDEX_TYPE_BOOL:
indexParams->setBool(_name, (int) ip[i]["value"] != 0);
break;
case CV_MAKETYPE(CV_USRTYPE1,3):
case FLANN_INDEX_TYPE_ALGORITHM:
indexParams->setAlgorithm((int) ip[i]["value"]);
break;
// don't default: - compiler warning is here
};
}
@@ -1218,32 +1223,34 @@ void FlannBasedMatcher::read( const FileNode& fn)
{
CV_Assert(sp[i].type() == FileNode::MAP);
String _name = (String)sp[i]["name"];
int type = (int)sp[i]["type"];
FlannIndexType type = (FlannIndexType)(int)sp[i]["type"];
CV_CheckLE((int)type, (int)LAST_VALUE_FLANN_INDEX_TYPE, "");
switch(type)
{
case CV_8U:
case CV_8S:
case CV_16U:
case CV_16S:
case CV_32S:
case FLANN_INDEX_TYPE_8U:
case FLANN_INDEX_TYPE_8S:
case FLANN_INDEX_TYPE_16U:
case FLANN_INDEX_TYPE_16S:
case FLANN_INDEX_TYPE_32S:
searchParams->setInt(_name, (int) sp[i]["value"]);
break;
case CV_32F:
case FLANN_INDEX_TYPE_32F:
searchParams->setFloat(_name, (float) ip[i]["value"]);
break;
case CV_64F:
case FLANN_INDEX_TYPE_64F:
searchParams->setDouble(_name, (double) ip[i]["value"]);
break;
case CV_USRTYPE1:
case FLANN_INDEX_TYPE_STRING:
searchParams->setString(_name, (String) ip[i]["value"]);
break;
case CV_MAKETYPE(CV_USRTYPE1,2):
case FLANN_INDEX_TYPE_BOOL:
searchParams->setBool(_name, (int) ip[i]["value"] != 0);
break;
case CV_MAKETYPE(CV_USRTYPE1,3):
case FLANN_INDEX_TYPE_ALGORITHM:
searchParams->setAlgorithm((int) ip[i]["value"]);
break;
// don't default: - compiler warning is here
};
}
@@ -1258,7 +1265,7 @@ void FlannBasedMatcher::write( FileStorage& fs) const
if (indexParams)
{
std::vector<String> names;
std::vector<int> types;
std::vector<FlannIndexType> types;
std::vector<String> strValues;
std::vector<double> numValues;
@@ -1267,38 +1274,43 @@ void FlannBasedMatcher::write( FileStorage& fs) const
for(size_t i = 0; i < names.size(); ++i)
{
fs << "{" << "name" << names[i] << "type" << types[i] << "value";
switch(types[i])
FlannIndexType type = (FlannIndexType)types[i];
if ((int)type < 0 || type > LAST_VALUE_FLANN_INDEX_TYPE)
{
case CV_8U:
fs << (uchar)numValues[i];
break;
case CV_8S:
fs << (char)numValues[i];
break;
case CV_16U:
fs << (ushort)numValues[i];
break;
case CV_16S:
fs << (short)numValues[i];
break;
case CV_32S:
case CV_MAKETYPE(CV_USRTYPE1,2):
case CV_MAKETYPE(CV_USRTYPE1,3):
fs << (int)numValues[i];
break;
case CV_32F:
fs << (float)numValues[i];
break;
case CV_64F:
fs << (double)numValues[i];
break;
case CV_USRTYPE1:
fs << strValues[i];
break;
default:
fs << (double)numValues[i];
fs << "typename" << strValues[i];
fs << "}";
continue;
}
switch(type)
{
case FLANN_INDEX_TYPE_8U:
fs << (uchar)numValues[i];
break;
case FLANN_INDEX_TYPE_8S:
fs << (char)numValues[i];
break;
case FLANN_INDEX_TYPE_16U:
fs << (ushort)numValues[i];
break;
case FLANN_INDEX_TYPE_16S:
fs << (short)numValues[i];
break;
case FLANN_INDEX_TYPE_32S:
case FLANN_INDEX_TYPE_BOOL:
case FLANN_INDEX_TYPE_ALGORITHM:
fs << (int)numValues[i];
break;
case FLANN_INDEX_TYPE_32F:
fs << (float)numValues[i];
break;
case FLANN_INDEX_TYPE_64F:
fs << (double)numValues[i];
break;
case FLANN_INDEX_TYPE_STRING:
fs << strValues[i];
break;
// don't default: - compiler warning is here
}
fs << "}";
}
@@ -1309,7 +1321,7 @@ void FlannBasedMatcher::write( FileStorage& fs) const
if (searchParams)
{
std::vector<String> names;
std::vector<int> types;
std::vector<FlannIndexType> types;
std::vector<String> strValues;
std::vector<double> numValues;
@@ -1318,23 +1330,31 @@ void FlannBasedMatcher::write( FileStorage& fs) const
for(size_t i = 0; i < names.size(); ++i)
{
fs << "{" << "name" << names[i] << "type" << types[i] << "value";
switch(types[i])
FlannIndexType type = (FlannIndexType)types[i];
if ((int)type < 0 || type > LAST_VALUE_FLANN_INDEX_TYPE)
{
case CV_8U:
fs << (double)numValues[i];
fs << "typename" << strValues[i];
fs << "}";
continue;
}
switch(type)
{
case FLANN_INDEX_TYPE_8U:
fs << (uchar)numValues[i];
break;
case CV_8S:
case FLANN_INDEX_TYPE_8S:
fs << (char)numValues[i];
break;
case CV_16U:
case FLANN_INDEX_TYPE_16U:
fs << (ushort)numValues[i];
break;
case CV_16S:
case FLANN_INDEX_TYPE_16S:
fs << (short)numValues[i];
break;
case CV_32S:
case CV_MAKETYPE(CV_USRTYPE1,2):
case CV_MAKETYPE(CV_USRTYPE1,3):
case FLANN_INDEX_TYPE_32S:
case FLANN_INDEX_TYPE_BOOL:
case FLANN_INDEX_TYPE_ALGORITHM:
fs << (int)numValues[i];
break;
case CV_32F:
@@ -1343,13 +1363,10 @@ void FlannBasedMatcher::write( FileStorage& fs) const
case CV_64F:
fs << (double)numValues[i];
break;
case CV_USRTYPE1:
case FLANN_INDEX_TYPE_STRING:
fs << strValues[i];
break;
default:
fs << (double)numValues[i];
fs << "typename" << strValues[i];
break;
// don't default: - compiler warning is here
}
fs << "}";
}