3

タイトルにあるように、cv :: Matの特定の領域、つまりRotatedRect内のゼロ以外のピクセルの数を見つけようとしています。

通常のRectの場合、ROIでcountNonZeroPixelsを使用するだけです。ただし、ROIは通常の(回転されていない)長方形のみです。

もう1つのアイデアは、回転した長方形を描画し、それをマスクとして使用することでした。ただし、openCVは回転した長方形の描画をサポートしておらず、countNonZeroPixelsはマスクを受け入れません。

誰かがこれをエレガントに解決する方法の解決策を持っていますか?

ありがとうございました !

4

3 に答える 3

3

わかりました、これが私の最初のテイクです。

アイデアは、画像を長方形の回転とは逆に回転させ、次にまっすぐにした長方形に 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);
    }
    
于 2011-07-12T05:43:31.293 に答える