Commit a3050f2ed75437b06ccccdf6b14fa95bea4275cc
1 parent
c2b1db42
Added rotation code to OpenCVUtils
Showing
3 changed files
with
64 additions
and
15 deletions
openbr/core/opencvutils.cpp
| @@ -541,6 +541,67 @@ void OpenCVUtils::group(QList<Rect> &rects, QList<float> &confidences, float con | @@ -541,6 +541,67 @@ void OpenCVUtils::group(QList<Rect> &rects, QList<float> &confidences, float con | ||
| 541 | } | 541 | } |
| 542 | } | 542 | } |
| 543 | 543 | ||
| 544 | +void OpenCVUtils::rotate(const br::Template &src, br::Template &dst, int degrees, bool rotateMat, bool rotatePoints, bool rotateRects) | ||
| 545 | +{ | ||
| 546 | + Mat rotMatrix = getRotationMatrix2D(Point2f(src.m().rows/2,src.m().cols/2),degrees,1.0); | ||
| 547 | + if (rotateMat) { | ||
| 548 | + warpAffine(src,dst,rotMatrix,Size(src.m().cols,src.m().rows),INTER_LINEAR,BORDER_REFLECT_101); | ||
| 549 | + dst.file = src.file; | ||
| 550 | + } else | ||
| 551 | + dst = src; | ||
| 552 | + | ||
| 553 | + if (rotatePoints) { | ||
| 554 | + QList<QPointF> points = src.file.points(); | ||
| 555 | + QList<QPointF> rotatedPoints; | ||
| 556 | + for (int i=0; i<points.size(); i++) { | ||
| 557 | + rotatedPoints.append(QPointF(points.at(i).x()*rotMatrix.at<double>(0,0)+ | ||
| 558 | + points.at(i).y()*rotMatrix.at<double>(0,1)+ | ||
| 559 | + rotMatrix.at<double>(0,2), | ||
| 560 | + points.at(i).x()*rotMatrix.at<double>(1,0)+ | ||
| 561 | + points.at(i).y()*rotMatrix.at<double>(1,1)+ | ||
| 562 | + rotMatrix.at<double>(1,2))); | ||
| 563 | + } | ||
| 564 | + | ||
| 565 | + dst.file.setPoints(rotatedPoints); | ||
| 566 | + } | ||
| 567 | + | ||
| 568 | + if (rotateRects) { | ||
| 569 | + QList<QRectF> rects = src.file.rects(); | ||
| 570 | + QList<QRectF> rotatedRects; | ||
| 571 | + for (int i=0; i<rects.size(); i++) { | ||
| 572 | + QList<QPointF> corners; | ||
| 573 | + corners << rects[i].topLeft() << rects[i].topRight() << rects[i].bottomLeft() << rects[i].bottomRight(); | ||
| 574 | + | ||
| 575 | + QList<QPointF> rotatedCorners; | ||
| 576 | + foreach (const QPointF &corner, corners) | ||
| 577 | + rotatedCorners.append(QPointF(corner.x() * rotMatrix.at<double>(0,0) + | ||
| 578 | + corner.y() * rotMatrix.at<double>(0,1) + | ||
| 579 | + rotMatrix.at<double>(0,2), | ||
| 580 | + corner.x() * rotMatrix.at<double>(1,0) + | ||
| 581 | + corner.y() * rotMatrix.at<double>(1,1) + | ||
| 582 | + rotMatrix.at<double>(1,2))); | ||
| 583 | + | ||
| 584 | + float top = min(rotatedCorners[0].y(), rotatedCorners[1].y()); | ||
| 585 | + float left = min(rotatedCorners[0].x(), rotatedCorners[2].x()); | ||
| 586 | + float bottom = max(rotatedCorners[2].y(), rotatedCorners[3].y()); | ||
| 587 | + float right = max(rotatedCorners[1].x(), rotatedCorners[3].x()); | ||
| 588 | + | ||
| 589 | + rotatedRects.append(QRectF(QPointF(left,top),QPointF(right,bottom))); | ||
| 590 | + } | ||
| 591 | + | ||
| 592 | + dst.file.setRects(rotatedRects); | ||
| 593 | + } | ||
| 594 | +} | ||
| 595 | + | ||
| 596 | +void OpenCVUtils::rotate(const br::TemplateList &src, br::TemplateList &dst, int degrees, bool rotateMat, bool rotatePoints, bool rotateRects) | ||
| 597 | +{ | ||
| 598 | + for (int i=0; i<src.size(); i++) { | ||
| 599 | + br::Template t; | ||
| 600 | + flip(src[i], t, degrees, rotateMat, rotatePoints, rotateRects); | ||
| 601 | + dst.append(t); | ||
| 602 | + } | ||
| 603 | +} | ||
| 604 | + | ||
| 544 | void OpenCVUtils::flip(const br::Template &src, br::Template &dst, int axis, bool flipMat, bool flipPoints, bool flipRects) | 605 | void OpenCVUtils::flip(const br::Template &src, br::Template &dst, int axis, bool flipMat, bool flipPoints, bool flipRects) |
| 545 | { | 606 | { |
| 546 | if (flipMat) { | 607 | if (flipMat) { |
openbr/core/opencvutils.h
| @@ -103,6 +103,8 @@ namespace OpenCVUtils | @@ -103,6 +103,8 @@ namespace OpenCVUtils | ||
| 103 | 103 | ||
| 104 | // Misc | 104 | // Misc |
| 105 | void group(QList<cv::Rect> &rects, QList<float> &confidences, float confidenceThreshold, int minNeighbors, float epsilon); | 105 | void group(QList<cv::Rect> &rects, QList<float> &confidences, float confidenceThreshold, int minNeighbors, float epsilon); |
| 106 | + void rotate(const br::Template &src, br::Template &dst, int degrees, bool rotateMat=true, bool rotatePoints=true, bool rotateRects=true); | ||
| 107 | + void rotate(const br::TemplateList &src, br::TemplateList &dst, int degrees, bool rotateMat=true, bool rotatePoint=true, bool rotateRects=true); | ||
| 106 | void flip(const br::Template &src, br::Template &dst, int axis, bool flipMat=true, bool flipPoints=true, bool flipRects=true); | 108 | void flip(const br::Template &src, br::Template &dst, int axis, bool flipMat=true, bool flipPoints=true, bool flipRects=true); |
| 107 | void flip(const br::TemplateList &src, br::TemplateList &dst, int axis, bool flipMat=true, bool flipPoints=true, bool flipRects=true); | 109 | void flip(const br::TemplateList &src, br::TemplateList &dst, int axis, bool flipMat=true, bool flipPoints=true, bool flipRects=true); |
| 108 | 110 |
openbr/plugins/imgproc/rndrotate.cpp
| @@ -40,21 +40,7 @@ class RndRotateTransform : public UntrainableTransform | @@ -40,21 +40,7 @@ class RndRotateTransform : public UntrainableTransform | ||
| 40 | void project(const Template &src, Template &dst) const { | 40 | void project(const Template &src, Template &dst) const { |
| 41 | int span = range.first() - range.last(); | 41 | int span = range.first() - range.last(); |
| 42 | int angle = span == 0 ? range.first() : (rand() % span) + range.first(); | 42 | int angle = span == 0 ? range.first() : (rand() % span) + range.first(); |
| 43 | - Mat rotMatrix = getRotationMatrix2D(center == -1 ? Point2f(src.m().rows/2,src.m().cols/2) : OpenCVUtils::toPoint(src.file.points()[center]),angle,1.0); | ||
| 44 | - warpAffine(src,dst,rotMatrix,Size(src.m().cols,src.m().rows),INTER_LINEAR,BORDER_REFLECT_101); | ||
| 45 | - | ||
| 46 | - QList<QPointF> points = src.file.points(); | ||
| 47 | - QList<QPointF> rotatedPoints; | ||
| 48 | - for (int i=0; i<points.size(); i++) { | ||
| 49 | - rotatedPoints.append(QPointF(points.at(i).x()*rotMatrix.at<double>(0,0)+ | ||
| 50 | - points.at(i).y()*rotMatrix.at<double>(0,1)+ | ||
| 51 | - rotMatrix.at<double>(0,2), | ||
| 52 | - points.at(i).x()*rotMatrix.at<double>(1,0)+ | ||
| 53 | - points.at(i).y()*rotMatrix.at<double>(1,1)+ | ||
| 54 | - rotMatrix.at<double>(1,2))); | ||
| 55 | - } | ||
| 56 | - | ||
| 57 | - dst.file.setPoints(rotatedPoints); | 43 | + OpenCVUtils::rotate(src, dst, angle); |
| 58 | } | 44 | } |
| 59 | }; | 45 | }; |
| 60 | 46 |