如何在四个象限中划分图像并用OpenCV将象限1和4旋转180度?

时间:2016-11-06 23:38:35

标签: c++ opencv opencv-mat

所以,当我必须拍摄一张图像,将其分成四个象限,然后在相同的图像中旋转第四个象限,而不创建另一个窗口时,我有这个活动。我已经有了这个代码,但我只是在不同的窗口中进行轮换,这是我的主要问题。如果这有帮助,我使用CLR项目在Visual Studio中创建了代码。谢谢。

#include "stdafx.h"
#include <iostream>
#include <opencv\cv.h>
#include <opencv\cxcore.h>
#include <opencv\highgui.h>
#include <cmath>

using namespace System;
using namespace std;
using namespace cv;

int main( int argc, char** argv ){ 
    CvPoint pt1, pt2;
    int width; 
    int height; 
    IplImage* img = cvLoadImage("C:/Users/Munii/Documents/Visual Studio 2010/Projects/Proyecto/Proyecto/Imagen.jpg"); 

    pt1.x=0; 
    pt1.y=0; 
    pt2.x = (img->width)/2; 
    pt2.y = (img->height)/2; 
    width = img->width; 
    height = img->height; 

    IplImage* rotated=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,img->nChannels);
    CvPoint2D32f center;
    float angle=180;
    CvMat* M = cvCreateMat(2,3,CV_32FC1);
    center.x = (img->width)/2.0;
    center.y = (img->height)/2.0;
    cv2DRotationMatrix(center,angle,1.0,M);
    cvWarpAffine(img,rotated,M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0)); 
    cvSetImageROI(rotated, cvRect( pt1.x, pt1.y, pt2.x, pt2.y)); 

    pt1.x = (img->width)/2;
    pt1.y = (img->height)/2;  
    pt2.x = img->width;
    pt2.y = img->height;  

    IplImage* rot=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,img->nChannels);
    center.x=img->width/2.0;
    center.y=img->height/2.0;
    cv2DRotationMatrix(center,angle,1.0,M);
    cvWarpAffine(img,rot,M,CV_INTER_LINEAR+CV_WARP_FILL_OUTLIERS, cvScalarAll(0)); 
    cvSetImageROI(rot, cvRect( pt1.x, pt1.y, pt1.x, pt2.y)); 

    cvNamedWindow("Ejemplo 3", CV_WINDOW_AUTOSIZE); //creamos una ventana con el nombre Ejemplo 3
    cvNamedWindow("ROI", CV_WINDOW_AUTOSIZE); 
    cvNamedWindow("RO", CV_WINDOW_AUTOSIZE); //creamos una ventana con el nombre ROI donde estará la región de interes
    cvShowImage("Ejemplo 3", img);
    cvShowImage("ROI",rotated);
    cvShowImage("RO",rot); //mostramos la imagen en la ventana anteriormente creada
    cvSaveImage("C:/Users/Munii/Documents/Visual Studio 2010/Projects/Proyecto/Proyecto/RotacionI.jpg", rotated);
    cvSaveImage("C:/Users/Munii/Documents/Visual Studio 2010/Projects/Proyecto/Proyecto/RotacionIV.jpg", rot);
    cvWaitKey(0);
    cvDestroyWindow("ROI" );
    cvDestroyWindow("RO" );
    cvReleaseImage( &img );
    cvDestroyWindow("Ejemplo3" );    
    cvReleaseImage(&rotated);   
    cvReleaseMat(&M);
}

2 个答案:

答案 0 :(得分:0)

所以,谢谢你帮助我的人。我已经可以解决这个问题,一位朋友告诉我,获得我想要的结果越容易使用函数Rect将图像分成四个象限,然后使用getRotationMatrix2D()和warpAffine创建旋转我想要的象限的函数()最后我使用函数hconcat()和vconcat()将我之前创建的四个图像从原始图像连接到一个新窗口并显示结果图像。

答案 1 :(得分:0)

以下是您可以使用C ++代码的内容,不多也不少:

const int rot180 {-1};
cv::Mat img = cv::imread("path/to/your/image");
cv::imshow("Original", img);

cv::Mat upLeft = img({0, img.rows/2}, {0, img.cols/2});
cv::flip(upLeft, upLeft, rot180);

cv::Mat downRight = img({img.rows/2, img.rows}, {img.cols/2, img.cols});
cv::flip(downRight, downRight, rot180);

cv::imshow("Rotated", img);
cv::imwrite("path/to/your/new/image", img);

cv::waitKey();
cv::destroyAllWindows();

upLeftdownRight都是直接针对img的投资回报率 请随时复制:

cv::Mat src = img.clone();