Commit b8c2696b185ece058c5c473a9e025c5c2fb4a598
1 parent
087a8f65
removed untested options and code paths
CUDAAffine will only have bilinear transformation with a single reference point for now
Showing
1 changed file
with
8 additions
and
60 deletions
openbr/plugins/cuda/cudaaffine.cpp
| @@ -47,46 +47,24 @@ namespace br | @@ -47,46 +47,24 @@ namespace br | ||
| 47 | 47 | ||
| 48 | /*! | 48 | /*! |
| 49 | * \ingroup transforms | 49 | * \ingroup transforms |
| 50 | - * \brief Performs a two or three point registration on the GPU. Modified from stock OpenBR implementation | 50 | + * \brief Performs a two or three point registration on the GPU. Modified from stock OpenBR implementation. Only supports single-point input bilinear transformation. |
| 51 | * \author Greg Schrock \cite gls022 | 51 | * \author Greg Schrock \cite gls022 |
| 52 | + * \author Colin Heinzmann \cite DepthDeluxe | ||
| 52 | * \note Method: Area should be used for shrinking an image, Cubic for slow but accurate enlargment, Bilin for fast enlargement. | 53 | * \note Method: Area should be used for shrinking an image, Cubic for slow but accurate enlargment, Bilin for fast enlargement. |
| 53 | */ | 54 | */ |
| 54 | class CUDAAffineTransform : public UntrainableTransform | 55 | class CUDAAffineTransform : public UntrainableTransform |
| 55 | { | 56 | { |
| 56 | Q_OBJECT | 57 | Q_OBJECT |
| 57 | - Q_ENUMS(Method) | ||
| 58 | 58 | ||
| 59 | - public: | ||
| 60 | - /*!< */ | ||
| 61 | - enum Method { Near = INTER_NEAREST, | ||
| 62 | - Area = INTER_AREA, | ||
| 63 | - Bilin = INTER_LINEAR, | ||
| 64 | - Cubic = INTER_CUBIC, | ||
| 65 | - Lanczo = INTER_LANCZOS4}; | ||
| 66 | - | ||
| 67 | - private: | 59 | + private: |
| 68 | Q_PROPERTY(int width READ get_width WRITE set_width RESET reset_width STORED false) | 60 | Q_PROPERTY(int width READ get_width WRITE set_width RESET reset_width STORED false) |
| 69 | Q_PROPERTY(int height READ get_height WRITE set_height RESET reset_height STORED false) | 61 | Q_PROPERTY(int height READ get_height WRITE set_height RESET reset_height STORED false) |
| 70 | Q_PROPERTY(float x1 READ get_x1 WRITE set_x1 RESET reset_x1 STORED false) | 62 | Q_PROPERTY(float x1 READ get_x1 WRITE set_x1 RESET reset_x1 STORED false) |
| 71 | Q_PROPERTY(float y1 READ get_y1 WRITE set_y1 RESET reset_y1 STORED false) | 63 | Q_PROPERTY(float y1 READ get_y1 WRITE set_y1 RESET reset_y1 STORED false) |
| 72 | - Q_PROPERTY(float x2 READ get_x2 WRITE set_x2 RESET reset_x2 STORED false) | ||
| 73 | - Q_PROPERTY(float y2 READ get_y2 WRITE set_y2 RESET reset_y2 STORED false) | ||
| 74 | - Q_PROPERTY(float x3 READ get_x3 WRITE set_x3 RESET reset_x3 STORED false) | ||
| 75 | - Q_PROPERTY(float y3 READ get_y3 WRITE set_y3 RESET reset_y3 STORED false) | ||
| 76 | - Q_PROPERTY(Method method READ get_method WRITE set_method RESET reset_method STORED false) | ||
| 77 | - Q_PROPERTY(bool storeAffine READ get_storeAffine WRITE set_storeAffine RESET reset_storeAffine STORED false) | ||
| 78 | - Q_PROPERTY(bool warpPoints READ get_warpPoints WRITE set_warpPoints RESET reset_warpPoints STORED false) | ||
| 79 | BR_PROPERTY(int, width, 64) | 64 | BR_PROPERTY(int, width, 64) |
| 80 | BR_PROPERTY(int, height, 64) | 65 | BR_PROPERTY(int, height, 64) |
| 81 | BR_PROPERTY(float, x1, 0) | 66 | BR_PROPERTY(float, x1, 0) |
| 82 | BR_PROPERTY(float, y1, 0) | 67 | BR_PROPERTY(float, y1, 0) |
| 83 | - BR_PROPERTY(float, x2, -1) | ||
| 84 | - BR_PROPERTY(float, y2, -1) | ||
| 85 | - BR_PROPERTY(float, x3, -1) | ||
| 86 | - BR_PROPERTY(float, y3, -1) | ||
| 87 | - BR_PROPERTY(Method, method, Bilin) | ||
| 88 | - BR_PROPERTY(bool, storeAffine, false) | ||
| 89 | - BR_PROPERTY(bool, warpPoints, false) | ||
| 90 | 68 | ||
| 91 | static Point2f getThirdAffinePoint(const Point2f &a, const Point2f &b) | 69 | static Point2f getThirdAffinePoint(const Point2f &a, const Point2f &b) |
| 92 | { | 70 | { |
| @@ -97,25 +75,21 @@ namespace br | @@ -97,25 +75,21 @@ namespace br | ||
| 97 | 75 | ||
| 98 | void project(const Template &src, Template &dst) const | 76 | void project(const Template &src, Template &dst) const |
| 99 | { | 77 | { |
| 100 | - const bool twoPoints = ((x3 == -1) || (y3 == -1)); | ||
| 101 | - | ||
| 102 | Point2f dstPoints[3]; | 78 | Point2f dstPoints[3]; |
| 103 | dstPoints[0] = Point2f(x1*width, y1*height); | 79 | dstPoints[0] = Point2f(x1*width, y1*height); |
| 104 | - dstPoints[1] = Point2f((x2 == -1 ? 1 - x1 : x2)*width, (y2 == -1 ? y1 : y2)*height); | ||
| 105 | - if (twoPoints) dstPoints[2] = getThirdAffinePoint(dstPoints[0], dstPoints[1]); | ||
| 106 | - else dstPoints[2] = Point2f(x3*width, y3*height); | 80 | + dstPoints[1] = Point2f((1-x1)*width, (1-y1)*height); |
| 81 | + dstPoints[2] = getThirdAffinePoint(dstPoints[0], dstPoints[1]); | ||
| 107 | 82 | ||
| 108 | Point2f srcPoints[3]; | 83 | Point2f srcPoints[3]; |
| 109 | if (src.file.contains("Affine_0") && | 84 | if (src.file.contains("Affine_0") && |
| 110 | src.file.contains("Affine_1") && | 85 | src.file.contains("Affine_1") && |
| 111 | - (src.file.contains("Affine_2") || twoPoints)) { | 86 | + src.file.contains("Affine_2")) { |
| 112 | srcPoints[0] = OpenCVUtils::toPoint(src.file.get<QPointF>("Affine_0")); | 87 | srcPoints[0] = OpenCVUtils::toPoint(src.file.get<QPointF>("Affine_0")); |
| 113 | srcPoints[1] = OpenCVUtils::toPoint(src.file.get<QPointF>("Affine_1")); | 88 | srcPoints[1] = OpenCVUtils::toPoint(src.file.get<QPointF>("Affine_1")); |
| 114 | - if (!twoPoints) srcPoints[2] = OpenCVUtils::toPoint(src.file.get<QPointF>("Affine_2")); | ||
| 115 | } else { | 89 | } else { |
| 116 | const QList<Point2f> landmarks = OpenCVUtils::toPoints(src.file.points()); | 90 | const QList<Point2f> landmarks = OpenCVUtils::toPoints(src.file.points()); |
| 117 | 91 | ||
| 118 | - if ((landmarks.size() < 2) || (!twoPoints && (landmarks.size() < 3))) { | 92 | + if (landmarks.size() < 2) { |
| 119 | void* const* srcDataPtr = src.m().ptr<void*>(); | 93 | void* const* srcDataPtr = src.m().ptr<void*>(); |
| 120 | int rows = *((int*)srcDataPtr[1]); | 94 | int rows = *((int*)srcDataPtr[1]); |
| 121 | int cols = *((int*)srcDataPtr[2]); | 95 | int cols = *((int*)srcDataPtr[2]); |
| @@ -134,10 +108,9 @@ namespace br | @@ -134,10 +108,9 @@ namespace br | ||
| 134 | } else { | 108 | } else { |
| 135 | srcPoints[0] = landmarks[0]; | 109 | srcPoints[0] = landmarks[0]; |
| 136 | srcPoints[1] = landmarks[1]; | 110 | srcPoints[1] = landmarks[1]; |
| 137 | - if (!twoPoints) srcPoints[2] = landmarks[2]; | ||
| 138 | } | 111 | } |
| 139 | } | 112 | } |
| 140 | - if (twoPoints) srcPoints[2] = getThirdAffinePoint(srcPoints[0], srcPoints[1]); | 113 | + srcPoints[2] = getThirdAffinePoint(srcPoints[0], srcPoints[1]); |
| 141 | 114 | ||
| 142 | Mat affineTransform = getAffineTransform(srcPoints, dstPoints); | 115 | Mat affineTransform = getAffineTransform(srcPoints, dstPoints); |
| 143 | 116 | ||
| @@ -155,31 +128,6 @@ namespace br | @@ -155,31 +128,6 @@ namespace br | ||
| 155 | 128 | ||
| 156 | cuda::affine::wrapper(srcDataPtr[0], &dstDataPtr[0], affineTransform, rows, cols, height, width); | 129 | cuda::affine::wrapper(srcDataPtr[0], &dstDataPtr[0], affineTransform, rows, cols, height, width); |
| 157 | 130 | ||
| 158 | - // end altered code | ||
| 159 | - | ||
| 160 | - if (warpPoints) { | ||
| 161 | - QList<QPointF> points = src.file.points(); | ||
| 162 | - QList<QPointF> rotatedPoints; | ||
| 163 | - for (int i=0; i<points.size(); i++) { | ||
| 164 | - rotatedPoints.append(QPointF(points.at(i).x()*affineTransform.at<double>(0,0)+ | ||
| 165 | - points.at(i).y()*affineTransform.at<double>(0,1)+ | ||
| 166 | - affineTransform.at<double>(0,2), | ||
| 167 | - points.at(i).x()*affineTransform.at<double>(1,0)+ | ||
| 168 | - points.at(i).y()*affineTransform.at<double>(1,1)+ | ||
| 169 | - affineTransform.at<double>(1,2))); | ||
| 170 | - } | ||
| 171 | - | ||
| 172 | - dst.file.setPoints(rotatedPoints); | ||
| 173 | - } | ||
| 174 | - | ||
| 175 | - if (storeAffine) { | ||
| 176 | - QList<float> affineParams; | ||
| 177 | - for (int i = 0 ; i < 2; i++) | ||
| 178 | - for (int j = 0; j < 3; j++) | ||
| 179 | - affineParams.append(affineTransform.at<double>(i, j)); | ||
| 180 | - dst.file.setList("affineParameters", affineParams); | ||
| 181 | - } | ||
| 182 | - | ||
| 183 | dst = dstMat; | 131 | dst = dstMat; |
| 184 | } | 132 | } |
| 185 | }; | 133 | }; |