Поверните область, чтобы выровнять большую ось по горизонтали с opencv

Пожалуйста, может кто-то здесь, кто может помочь мне с этим. Я пытаюсь повернуть сегментированную область изображения, чтобы выровнять большую ось по горизонтали.
У меня есть сегментированная область в центре изображения, следуя шагам, использованным здесь. Переместить область изображения в центр, используя OpenCV
Я читаю это OPENCV: ошибка приложения PCA в image_proc, но это не помогает мне решить мою проблему.
у меня есть это

я хочу этот

0

Решение

Немного отличающийся от предложенного Мики, я использовал findNonZero, minAreaRect и WarpAffine.

Вы можете использовать 270 или 90 в getRotationMatrix2D, чтобы выровнять главную ось по горизонтали.

#include "stdafx.h"#include <opencv/cxcore.h>
#include <opencv2\core\mat.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
#include <opencv/cxcore.h>
#include <opencv/highgui.h>
#include <opencv/cv.h>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/videoio/videoio.hpp>

using namespace cv;
using namespace std;int main() {

//getting the image
Mat image = imread("C:/this/is/a/path/to/an/image.png");

//create new image that looks exactly like old image
Mat rot_image = image.clone();
rot_image = Scalar(0);

//showing the image
namedWindow("Image", CV_WINDOW_NORMAL| CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED);
namedWindow("Rotated Image", CV_WINDOW_NORMAL| CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED);
imshow("Image", image);
waitKey(0);
imshow("Rotated Image", rot_image);
waitKey(0);

//convert image
Mat img_bw;
inRange(image, Scalar(1,1,1), Scalar(255,255,255), img_bw);
imshow("Rotated Image", img_bw);
waitKey(0);

//find coordinates
Mat nonZeroCoordinates;
findNonZero(img_bw, nonZeroCoordinates);
RotatedRect rect = minAreaRect(nonZeroCoordinates);
rect.center = Point(image.cols/2, image.rows/2);

//get the Rotation Matrix
Mat M = getRotationMatrix2D(rect.center, 270, 1.0);
// perform the affine transformation
warpAffine(image, rot_image, M, image.size(), INTER_CUBIC);

//displaying the image
imshow("Rotated Image", rot_image);
waitKey(0);

//saving the new image
imwrite("C:/this/is/a/path/to/a/rotatedImage.png", rot_image);

}

Этот код превращает это:

Обрезанное изображение ч / б без поворота там

к этому:

введите описание ссылки здесь

Вы можете взять rect.center Вычеркните, если вы уверены, что ваш объект уже будет в центре.

0

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


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector