opencv — изображение, скопированное в ROI, не соответствует камере c ++. Как это исправить?

Я работаю на Windows7 x64 с opencv и Visual Studio 2010 на языке c ++.

Я создал проект, в котором я показываю своей камере прямоугольную область (вызов squared_surface). Эта область распознается по трассировке прямоугольника с findSquare () а также drawSquares () файла opencv squares.cpp,
На этом прямоугольнике я создаю ROI, и там я копирую изображение (давайте назовем copied_image)

Моя проблема в том, что когда я вращаюсь squared_surface (перед камерой), copied_image не следует за этим.

Я думаю, что мне нужно использовать функции getPerpective () а также warpPerspective (), Но я не знаю как. Может кто-нибудь мне помочь?

Вот код:

int main(){
vector<vector<Point> > squares;

cv::VideoCapture cap(0);
for (;;) {
cv::Mat image;
cap >> image;
findSquares(image, squares);
for (size_t i = 0; i < squares.size(); i++) {
Rect rectangle = boundingRect(Mat(squares[i]));

if((rectangle.width<=630)&& (rectangle.width >= 420) && (rectangle.height<= 490) &&(rectangle.height >= 250 )) {
cv::Size dsize = Size(rectangle.width, rectangle.height);
Mat img1 = imread("scacchiera.jpg");
cv::resize(img1,img1,dsize,0,0, INTER_LINEAR);
Rect roi (rectangle.x, rectangle.y,rectangle.width, rectangle.height);

Mat imageRoi(image, roi);
img1.copyTo(imageRoi);
}
}
drawSquares(image, squares);
imshow("camera",image);
if(waitKey(30) >= 0) break;
}
return 0;
}

введите описание изображения здесь
введите описание изображения здесь

Спасибо!

РЕДАКТИРОВАТЬ.
Я думал о вращении Copied_image, так следует Squared_surface, но мне нужно вычислить угол поворота прямоугольника, идентифицированного камерой (нарисовано красным на изображениях выше). Есть ли способ рассчитать этот угол?

Или как я могу сделать так, чтобы Copied_image следует Squared_surface когда я поверну squared_surface?

Помоги мне, пожалуйста!

3

Решение

Я думаю, что нашел ошибку. Rect rectangle = boundingRect(Mat(squares[i])); Вот где проблема. Вы создаете переменную rectangle в качестве ограничительного прямоугольника координат в squares[i], Таким образом, ваш код всегда пытается найти ограничивающий прямоугольник, а не фактический прямоугольник.

Вместо использования ограничивающего прямоугольника, попробуйте использовать повернутый прямоугольник. Вот как это использовать: http://www710.univ-lyon1.fr/~eguillou/documentation/opencv2/classcv_1_1_rotated_rect.html

Повернутый прямоугольник RotatedRect (const Point2f &_center, const Size2f &_size, float _angle) требует расположения центральной точки, угла с плавающей точкой и размера. Поскольку у вас есть все координаты, я думаю, что вы можете использовать основную математику и тригонометрию, чтобы вычислить центр и угол поворота / ориентации вашего прямоугольника.
Позвольте мне знать, если это помогает.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]