我有一个 RotatedRect ,我想在旋转区域中做一些图像处理(比如提取颜色直方图)。我怎样才能获得投资返回率?我的意思是获取区域(像素)以便我可以进行处理。

我找到了 this ,但它通过使用 getRotationMatrix2D warpAffine 改变了区域,所以它不适用于我的情况(我需要处理原始图像像素)。
然后我发现 this 建议使用 掩码 ,这听起来很合理,但谁能教我如何获得下面的绿色 RotatedRect 掩码。

除了口罩,还有其他解决方案吗?
谢谢你的提示

最佳答案

这是我的解决方案,使用 掩码 :
这个想法是通过将 255 分配给我的 Mat mask 来构造一个 RotatedRect ROI

如何知道 ROI 中的哪一点(应该分配给 255)?
我使用以下函数 isInROI 来解决这个问题。

/** 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;
}

如何构造 掩码
使用以下代码。
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;
        }
    }
}

完毕,
万茜

关于image-processing - OpenCV 中的 RotatedRect ROI,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13080515/

10-12 22:20