Oto moje rozwiązanie, wykorzystujące maskę:
Pomysł jest skonstruowanie Mat mask
przypisując 255 do mojego RotatedRect ROI
.
Jak sprawdzić, który punkt jest w ROI (który powinien być przypisany do 255)?
Używam następującej funkcji isInROI
do rozwiązania problemu.
/** decide whether point p is in the ROI.
*** The ROI is a rotated rectange whose 4 corners are stored in roi[]
**/
bool isInROI(Point p, Point2f roi[])
{
double pro[4];
for(int i=0; i<4; ++i)
{
pro[i] = computeProduct(p, roi[i], roi[(i+1)%4]);
}
if(pro[0]*pro[2]<0 && pro[1]*pro[3]<0)
{
return true;
}
return false;
}
/** function pro = kx-y+j, take two points a and b,
*** compute the line argument k and j, then return the pro value
*** so that can be used to determine whether the point p is on the left or right
*** of the line ab
**/
double computeProduct(Point p, Point2f a, Point2f b)
{
double k = (a.y-b.y)/(a.x-b.x);
double j = a.y - k*a.x;
return k*p.x - p.y + j;
}
Jak skonstruować maskę?
Korzystanie z poniższego kodu.
Mat mask = Mat(image.size(), CV_8U, Scalar(0));
for(int i=0; i<image.rows; ++i)
{
for(int j=0; j<image.cols; ++j)
{
Point p = Point(j,i); // pay attention to the cordination
if(isInROI(p,vertices))
{
mask.at<uchar>(i,j) = 255;
}
}
}
Done,
vancexu
nie [to], (http://stackoverflow.com/questions/9082204/opencv-draw-a-white- fill-polygon) help? Wystarczy użyć fillPoly, aby narysować obróconego recta.Możesz uzyskać 4 punkty ograniczające go za pomocą jego rozmiaru i kąta – Hammer