Пожалуйста, может кто-то здесь, кто может помочь мне с этим. Я пытаюсь повернуть сегментированную область изображения, чтобы выровнять большую ось по горизонтали.
У меня есть сегментированная область в центре изображения, следуя шагам, использованным здесь. Переместить область изображения в центр, используя OpenCV
Я читаю это OPENCV: ошибка приложения PCA в image_proc, но это не помогает мне решить мою проблему.
у меня есть это
я хочу этот
Немного отличающийся от предложенного Мики, я использовал 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
Вычеркните, если вы уверены, что ваш объект уже будет в центре.