Fix cv::selectROI rectangle rendering issue

pull/15098/head
John Smith 6 years ago
parent 371bba8f54
commit 95c65aff75
No known key found for this signature in database
GPG Key ID: 35E398A6CD18824
  1. 36
      modules/highgui/src/roiSelector.cpp

@ -106,10 +106,10 @@ class ROISelector
bool isDrawing; bool isDrawing;
Rect2d box; Rect2d box;
Mat image; Mat image;
Point2f startPos;
// parameters for drawing from the center // parameters for drawing from the center
bool drawFromCenter; bool drawFromCenter;
Point2f center;
// initializer list // initializer list
handlerT() : isDrawing(false), drawFromCenter(true){}; handlerT() : isDrawing(false), drawFromCenter(true){};
@ -136,19 +136,31 @@ class ROISelector
{ {
if (selectorParams.drawFromCenter) if (selectorParams.drawFromCenter)
{ {
selectorParams.box.width = 2 * (x - selectorParams.center.x); // limit half extends to imageSize
selectorParams.box.height = 2 * (y - selectorParams.center.y); float halfWidth = std::min(std::min(
selectorParams.box.x = std::min( std::abs(x - selectorParams.startPos.x),
std::max(selectorParams.center.x - selectorParams.box.width / 2.0, 0.), (double)imageSize.width); selectorParams.startPos.x),
selectorParams.box.y = std::min( imageSize.width - selectorParams.startPos.x);
std::max(selectorParams.center.y - selectorParams.box.height / 2.0, 0.), (double)imageSize.height); float halfHeight = std::min(std::min(
std::abs(y - selectorParams.startPos.y),
selectorParams.startPos.y),
imageSize.height - selectorParams.startPos.y);
selectorParams.box.width = halfWidth * 2;
selectorParams.box.height = halfHeight * 2;
selectorParams.box.x = selectorParams.startPos.x - halfWidth;
selectorParams.box.y = selectorParams.startPos.y - halfHeight;
} }
else else
{ {
selectorParams.box.width = std::max( // limit x and y to imageSize
std::min(x - selectorParams.box.x, (double)imageSize.width - selectorParams.box.x), - selectorParams.box.x); int lx = std::min(std::max(x, 0), imageSize.width);
selectorParams.box.height = std::max( int by = std::min(std::max(y, 0), imageSize.height);
std::min(y - selectorParams.box.y, (double)imageSize.height - selectorParams.box.y), - selectorParams.box.y); selectorParams.box.width = std::abs(lx - selectorParams.startPos.x);
selectorParams.box.height = std::abs(by - selectorParams.startPos.y);
selectorParams.box.x = std::min((float)lx, selectorParams.startPos.x);
selectorParams.box.y = std::min((float)by, selectorParams.startPos.y);
} }
} }
break; break;
@ -157,7 +169,7 @@ class ROISelector
case EVENT_LBUTTONDOWN: case EVENT_LBUTTONDOWN:
selectorParams.isDrawing = true; selectorParams.isDrawing = true;
selectorParams.box = Rect2d(x, y, 0, 0); selectorParams.box = Rect2d(x, y, 0, 0);
selectorParams.center = Point2f((float)x, (float)y); selectorParams.startPos = Point2f((float)x, (float)y);
break; break;
// cleaning up the selected bounding box // cleaning up the selected bounding box

Loading…
Cancel
Save