2014-03-25 4 views
2

Хорошо, поэтому у меня проблемы с обрезкой моего повернутого изображения в opencv. Прежде всего, имеет значение, какой порядок точек в массиве подан в minAreaRect? Если нет, то я не знаю, что не так с моим кодом, но как только я обрезаю повернутое изображение, обрезанное изображение - это просто черный квадрат. Я полагаю, потому что моя коробка как-то не так. В любом случае, вот мой код. Изменить: мой метод был в порядке, проблема в том, что мои очки для roi неправильны.Обрезка повернутого изображения в opencv

   int len = max(ImageAd.cols, ImageAd.rows); 
      cv::Point2f pt(len/2., len/2.); 
      cv:: Mat r = cv::getRotationMatrix2D(pt, -angled, 1.0); 
      cv::warpAffine(ImageAd, ImageAd, r, ImageAd.size(), INTER_CUBIC); 
      vector<cv::Point> points; 
      points.push_back(Pt3); 
      points.push_back(Pt4); 
      points.push_back(Pt1); 
      points.push_back(Pt2); 

      cv::RotatedRect box = cv::minAreaRect(cv::Mat(points)); 
      cv::Size box_size = box.size; 

      cv::getRectSubPix(ImageAd, box_size, box.center, ImageAd); 
      cv::imshow("cropped", ImageAd); 
+0

Почему бы просто не взять roi? – nkint

+0

Каковы координаты прямоугольника? Можете ли вы запустить Point2f pts [4]; rect.points (PTS); и распечатать pts, чтобы убедиться, что они находятся в пределах вашего Mat (они могут быть отрицательными, если ваше исходное облако точек слишком близко к границе). – Vlad

+0

nkint - roi не является поворотным прямоугольником. Его стороны выровнены с осями координат, которые не всегда то, что вы хотите. – Vlad

ответ

1

Честно говоря, я никогда не использовал getRectSubPix, так что я не знаю точно, что это неправильно, но .. почему просто не взять КОРОЛЯ? API C++ с классом cv::Mat очень удобны для этого.

Вот documentation. Вы можете взять ROI (это интересная область, если вы еще этого не знаете) с помощью перегруженного оператора функции вызова cv::Mat

Во всяком случае вот фрагмент для отбора ROI

cv::Mat img = …; 
cv::Mat subImg = img(cv::Rect(0, 0, 100, 100)); 
cv::Mat subImg = img(cv::Range(0, 0), cv::Range(100, 100)); 

у вас есть cv::RotatedRect так что вы можете напрямую использовать RotatedRect::boundingRect свойство.

+0

Хорошо, спасибо, что это лучший способ сделать это. – OneTwo

+0

Но у меня есть еще один вопрос. Проблема, я думаю, на самом деле в том, что точки, которые у меня есть, неверны. Я использовал четыре угла оригинального невращающегося изображения (0,0: img.cols, 0: img.cols, img.rows: 0, img .rows), поскольку точки, поданные в minAreaRect, которые, как я предполагаю, ошибочны, хотя я не знаю, какие моменты я должен использовать. – OneTwo

+0

извините, но я думаю, что лучше открыть новый вопрос, если это совершенно другой вопрос. – nkint

Смежные вопросы