Commit 85e03bedb080127f5909d11fc93429aeed55de72
1 parent
9f15f251
templatized some functions
Showing
4 changed files
with
33 additions
and
33 deletions
sdk/core/opencvutils.cpp
| @@ -173,22 +173,6 @@ QString OpenCVUtils::elemToString(const Mat &m, int r, int c) | @@ -173,22 +173,6 @@ QString OpenCVUtils::elemToString(const Mat &m, int r, int c) | ||
| 173 | return "?"; | 173 | return "?"; |
| 174 | } | 174 | } |
| 175 | 175 | ||
| 176 | -float OpenCVUtils::elemToFloat(const Mat &m, int r, int c) | ||
| 177 | -{ | ||
| 178 | - assert(m.channels() == 1); | ||
| 179 | - switch (m.depth()) { | ||
| 180 | - case CV_8U: return float(m.at<quint8>(r,c)); | ||
| 181 | - case CV_8S: return float(m.at<qint8>(r,c)); | ||
| 182 | - case CV_16U: return float(m.at<quint16>(r,c)); | ||
| 183 | - case CV_16S: return float(m.at<qint16>(r,c)); | ||
| 184 | - case CV_32S: return float(m.at<qint32>(r,c)); | ||
| 185 | - case CV_32F: return float(m.at<float>(r,c)); | ||
| 186 | - case CV_64F: return float(m.at<double>(r,c)); | ||
| 187 | - default: qFatal("Unknown matrix depth"); | ||
| 188 | - } | ||
| 189 | - return 0; | ||
| 190 | -} | ||
| 191 | - | ||
| 192 | QString OpenCVUtils::matrixToString(const Mat &m) | 176 | QString OpenCVUtils::matrixToString(const Mat &m) |
| 193 | { | 177 | { |
| 194 | QString result; | 178 | QString result; |
| @@ -225,18 +209,6 @@ QStringList OpenCVUtils::matrixToStringList(const Mat &m) | @@ -225,18 +209,6 @@ QStringList OpenCVUtils::matrixToStringList(const Mat &m) | ||
| 225 | return results; | 209 | return results; |
| 226 | } | 210 | } |
| 227 | 211 | ||
| 228 | -QList<float> OpenCVUtils::matrixToVector(const Mat &m) | ||
| 229 | -{ | ||
| 230 | - QList<float> results; | ||
| 231 | - vector<Mat> mv; | ||
| 232 | - split(m, mv); | ||
| 233 | - foreach (const Mat &mc, mv) | ||
| 234 | - for (int i=0; i<mc.rows; i++) | ||
| 235 | - for (int j=0; j<mc.cols; j++) | ||
| 236 | - results.append(elemToFloat(mc, i, j)); | ||
| 237 | - return results; | ||
| 238 | -} | ||
| 239 | - | ||
| 240 | Point2f OpenCVUtils::toPoint(const QPointF &qPoint) | 212 | Point2f OpenCVUtils::toPoint(const QPointF &qPoint) |
| 241 | { | 213 | { |
| 242 | return Point2f(qPoint.x(), qPoint.y()); | 214 | return Point2f(qPoint.x(), qPoint.y()); |
sdk/core/opencvutils.h
| @@ -40,10 +40,38 @@ namespace OpenCVUtils | @@ -40,10 +40,38 @@ namespace OpenCVUtils | ||
| 40 | 40 | ||
| 41 | // From image | 41 | // From image |
| 42 | QString elemToString(const cv::Mat &m, int r, int c); | 42 | QString elemToString(const cv::Mat &m, int r, int c); |
| 43 | - float elemToFloat(const cv::Mat &m, int r, int c); | ||
| 44 | QString matrixToString(const cv::Mat &m); | 43 | QString matrixToString(const cv::Mat &m); |
| 45 | QStringList matrixToStringList(const cv::Mat &m); | 44 | QStringList matrixToStringList(const cv::Mat &m); |
| 46 | - QList<float> matrixToVector(const cv::Mat &m); | 45 | + |
| 46 | + template <typename T> | ||
| 47 | + T getElement(const cv::Mat &m, int r, int c) | ||
| 48 | + { | ||
| 49 | + assert(m.channels() == 1); | ||
| 50 | + switch (m.depth()) { | ||
| 51 | + case CV_8U: return T(m.at<quint8>(r,c)); | ||
| 52 | + case CV_8S: return T(m.at<qint8>(r,c)); | ||
| 53 | + case CV_16U: return T(m.at<quint16>(r,c)); | ||
| 54 | + case CV_16S: return T(m.at<qint16>(r,c)); | ||
| 55 | + case CV_32S: return T(m.at<qint32>(r,c)); | ||
| 56 | + case CV_32F: return T(m.at<float>(r,c)); | ||
| 57 | + case CV_64F: return T(m.at<double>(r,c)); | ||
| 58 | + default: qFatal("Unknown matrix depth!"); | ||
| 59 | + } | ||
| 60 | + return 0; | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + template <typename T> | ||
| 64 | + QList<T> matrixToVector(const cv::Mat &m) | ||
| 65 | + { | ||
| 66 | + QList<T> results; | ||
| 67 | + std::vector<cv::Mat> mv; | ||
| 68 | + cv::split(m, mv); | ||
| 69 | + foreach (const cv::Mat &mc, mv) | ||
| 70 | + for (int i=0; i<mc.rows; i++) | ||
| 71 | + for (int j=0; j<mc.cols; j++) | ||
| 72 | + results.append(getElement<float>(mc, i, j)); | ||
| 73 | + return results; | ||
| 74 | + } | ||
| 47 | 75 | ||
| 48 | // Conversions | 76 | // Conversions |
| 49 | cv::Point2f toPoint(const QPointF &qPoint); | 77 | cv::Point2f toPoint(const QPointF &qPoint); |
sdk/plugins/hist.cpp
| @@ -111,7 +111,7 @@ class RankTransform : public UntrainableTransform | @@ -111,7 +111,7 @@ class RankTransform : public UntrainableTransform | ||
| 111 | assert(m.channels() == 1); | 111 | assert(m.channels() == 1); |
| 112 | dst = Mat(m.rows, m.cols, CV_32FC1); | 112 | dst = Mat(m.rows, m.cols, CV_32FC1); |
| 113 | typedef QPair<float,int> Tuple; | 113 | typedef QPair<float,int> Tuple; |
| 114 | - QList<Tuple> tuples = Common::Sort(OpenCVUtils::matrixToVector(m)); | 114 | + QList<Tuple> tuples = Common::Sort(OpenCVUtils::matrixToVector<float>(m)); |
| 115 | 115 | ||
| 116 | float prevValue = 0; | 116 | float prevValue = 0; |
| 117 | int prevRank = 0; | 117 | int prevRank = 0; |
sdk/plugins/output.cpp
| @@ -176,7 +176,7 @@ class rrOutput : public MatrixOutput | @@ -176,7 +176,7 @@ class rrOutput : public MatrixOutput | ||
| 176 | if (!byLine) files.append(queryFiles[i]); | 176 | if (!byLine) files.append(queryFiles[i]); |
| 177 | 177 | ||
| 178 | typedef QPair<float,int> Pair; | 178 | typedef QPair<float,int> Pair; |
| 179 | - foreach (const Pair &pair, Common::Sort(OpenCVUtils::matrixToVector(data.row(i)), true, limit)) { | 179 | + foreach (const Pair &pair, Common::Sort(OpenCVUtils::matrixToVector<float>(data.row(i)), true, limit)) { |
| 180 | if (pair.first < threshold) break; | 180 | if (pair.first < threshold) break; |
| 181 | File target = targetFiles[pair.second]; | 181 | File target = targetFiles[pair.second]; |
| 182 | target.set("Score", QString::number(pair.first)); | 182 | target.set("Score", QString::number(pair.first)); |
| @@ -278,7 +278,7 @@ class rankOutput : public MatrixOutput | @@ -278,7 +278,7 @@ class rankOutput : public MatrixOutput | ||
| 278 | for (int i=0; i<queryFiles.size(); i++) { | 278 | for (int i=0; i<queryFiles.size(); i++) { |
| 279 | typedef QPair<float,int> Pair; | 279 | typedef QPair<float,int> Pair; |
| 280 | int rank = 1; | 280 | int rank = 1; |
| 281 | - foreach (const Pair &pair, Common::Sort(OpenCVUtils::matrixToVector(data.row(i)), true)) { | 281 | + foreach (const Pair &pair, Common::Sort(OpenCVUtils::matrixToVector<float>(data.row(i)), true)) { |
| 282 | if(targetFiles[pair.second].get<QString>("Label") == queryFiles[i].get<QString>("Label")) { | 282 | if(targetFiles[pair.second].get<QString>("Label") == queryFiles[i].get<QString>("Label")) { |
| 283 | ranks.append(rank); | 283 | ranks.append(rank); |
| 284 | positions.append(pair.second); | 284 | positions.append(pair.second); |