2016-11-06 7 views
0

イメージを4つの象限に分割し、同じイメージャで4つの象限を1つずつ回転させて、別のウィンドウを作成せずにこのアクティビティを実行します。私はすでにこのコードを持っていますが、私は別のウィンドウでローテーションを作成しなければなりません。それが私の主な問題です。これが役に立ちましたら、Visual StudioでCLRプロジェクトでコードを作成しました。ありがとうございました。イメージを4分割し、OpenCVで4分割1と4を180度回転させる方法は?

#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); 
} 
+1

最初のピットストップをCのAPIを減価償却とC++を使用します。次に、特定のROIにイメージをトリミングする方法に関するいくつかのドキュメントを読んでください。次に、変換を適用します –

+0

角度が90度の倍数の場合、 'cv :: flip'が良い選択です。 –

答えて

0

ありがとう、私にこれを手伝ってくれてありがとう。私はすでに問題を解決することができました。友人は、私が望む結果を得るためにもっともっと現実的なことは、関数Rectを使ってイメージを4つの象限に分割し、getRotationMatrix2D()とwarpAffineで必要な象限を回転する関数を作成することでした()と最後に関数hconcat()とvconcat()を使用して、以前作成した4つの画像を元の画像から新しいウィンドウに結合し、結果の画像を表示します。ここで

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(); 

upLeftdownRightimg時に直接作用する両方のROIです。
は前にコピーを作成すること自由に感じなさい:使用

cv::Mat src = img.clone(); 
関連する問題