gpt4 book ai didi

opencv - cv::RotatedRect 中的非零像素数

转载 作者:太空宇宙 更新时间:2023-11-03 21:04:29 31 4
gpt4 key购买 nike

正如标题所说,我正在尝试查找 cv::Mat 的特定区域中的非零像素数,即在 RotatedRect 中。

对于常规 Rect,可以简单地在 ROI 上使用 countNonZeroPixels。但是 ROI 只能是常规(非旋转)矩形。

另一个想法是绘制旋转的矩形并将其用作 mask 。然而,openCV 既不支持旋转矩形的绘制,也不支持 countNonZeroPixels 接受 mask 。

有没有人知道如何优雅地解决这个问题?

谢谢!

最佳答案

好的,这是我的第一次尝试。

想法是将图像与矩形的旋转反向旋转,然后在拉直的矩形上应用 roi。

  • 如果旋转的矩形不完全在图像内,这将中断
  • 您可以通过在旋转之前应用另一个 roi 来加快速度,以避免必须旋转整个图像...

    #include <highgui.h>
    #include <cv.h>


    // From http://stackoverflow.com/questions/2289690/opencv-how-to-rotate-iplimage
    cv::Mat rotateImage(const cv::Mat& source, cv::Point2f center, double angle)
    {
    cv::Mat rot_mat = cv::getRotationMatrix2D(center, angle, 1.0);
    cv::Mat dst;
    cv::warpAffine(source, dst, rot_mat, source.size());
    return dst;
    }

    int main()
    {
    cv::namedWindow("test1");

    // Our rotated rect
    int x = 300;
    int y = 350;
    int w = 200;
    int h = 50;
    float angle = 47;
    cv::RotatedRect rect = cv::RotatedRect(cv::Point2f(x,y), cv::Size2f(w,h), angle);

    // An empty image
    cv::Mat img = cv::Mat(cv::Size(640, 480), CV_8UC3);

    // Draw rotated rect as an ellipse to get some visual feedback
    cv::ellipse(img, rect, cv::Scalar(255,0,0), -1);

    // Rotate the image by rect.angle * -1
    cv::Mat rotimg = rotateImage(img, rect.center, -1 * rect.angle);

    // Set roi to the now unrotated rectangle
    cv::Rect roi;
    roi.x = rect.center.x - (rect.size.width / 2);
    roi.y = rect.center.y - (rect.size.height / 2);
    roi.width = rect.size.width;
    roi.height = rect.size.height;

    cv::imshow("test1", rotimg(roi));
    cv::waitKey(0);
    }

关于opencv - cv::RotatedRect 中的非零像素数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6653272/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com