2016-11-19 15 views
1

I current имеет ArrayList<MatOfPoint>, который сохраняет контуры изображения и извлекает самый большой контур, который является моей целью для warpPerspective.OpenCV getPspectiveTransform and warpPerspective Java

List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); 
Imgproc.findContours(matOut, contours, new Mat(), Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE); 

sort(contours); 
MatOfPoint2f m2f = MatOfPoint2f(contours.get(0).toArray()); 
double arc = Imgproc.arcLength(m2f, true); 
MatOfPoint2f approx = new MatOfPoint2f(); 
Imgproc.approxPolyDP(m2f, approx, arc*0.02, true); 

У меня возникают проблемы, как использовать getPerspectiveTransform и затем приклеивается warpPerspective изменить изображение таким образом, что он будет вписываться в 450x450 изображения.

Я нашел довольно хороший пример этого в python, однако я не очень хорошо знаком с ним, может кто-нибудь объяснить, как я буду исправлять в java?

def rectify(h): 
    ''' this function put vertices of square we got, in clockwise order ''' 
    h = h.reshape((4,2)) 
    hnew = np.zeros((4,2),dtype = np.float32) 

    add = h.sum(1) 
    hnew[0] = h[np.argmin(add)] 
    hnew[2] = h[np.argmax(add)] 

    diff = np.diff(h,axis = 1) 
    hnew[1] = h[np.argmin(diff)] 
    hnew[3] = h[np.argmax(diff)] 

    return hnew 

здесь есть ссылка на источник: https://github.com/abidrahmank/OpenCV2-Python/blob/master/OpenCV_Python_Blog/sudoku_v_0.0.6/sudoku.py

ответ

1

Введение: сделать использование wrapPerspective нам нужно рассчитать оберточной мат с использованием getPerspectiveTransform принимает: Mat ЦСИ и Mat ДСТ. Это MarOfPoints2f с src (нижний левый, нижний правый, верхний левый, правый верхний) вашего контура и соответствующий матовый dst (0,0; 0,449; 449,0; 449,449) (Таким образом, изображение будет 450x450 - Если это неправильно, исправьте меня).

Решение в Java для OpenCV 3 будет:

  1. Получить точки отсортирован Имея прямоугольный контур, как MatOfPoints2f около нам необходимо отсортировать точки, как написано выше:

    //calculate the center of mass of our contour image using moments 
    Moments moment = Imgproc.moments(approx.get(0)); 
    int x = (int) (moment.get_m10()/moment.get_m00()); 
    int y = (int) (moment.get_m01()/moment.get_m00()); 
    
    //SORT POINTS RELATIVE TO CENTER OF MASS 
    Point[] sortedPoints = new Point[4]; 
    
    double[] data; 
    int count = 0; 
    for(int i=0; i<approx.get(0).rows(); i++){ 
        data = approx.get(0).get(i, 0); 
        double datax = data[0]; 
        double datay = data[1]; 
        if(datax < x && datay < y){ 
         sortedPoints[0]=new Point(datax,datay); 
         count++; 
        }else if(datax > x && datay < y){ 
         sortedPoints[1]=new Point(datax,datay); 
         count++; 
        }else if (datax < x && datay > y){ 
         sortedPoints[2]=new Point(datax,datay); 
         count++; 
        }else if (datax > x && datay > y){ 
         sortedPoints[3]=new Point(datax,datay); 
         count++; 
        } 
    } 
    
  2. Подготовить Mat src и det

     MatOfPoint2f src = new MatOfPoint2f(
           sortedPoints[0], 
           sortedPoints[1], 
           sortedPoints[2], 
           sortedPoints[3]); 
    
         MatOfPoint2f dst = new MatOfPoint2f(
           new Point(0, 0), 
           new Point(450-1,0), 
           new Point(0,450-1), 
           new Point(450-1,450-1)  
           ); 
    
  3. Использование getPerspectiveTransform и wrapPrespective

    Mat warpMat = Imgproc.getPerspectiveTransform(src,dst); 
        //This is you new image as Mat 
        Mat destImage = new Mat(); 
        Imgproc.warpPerspective(originalImg, destImage, warpMat, originalImg.size()); 
    

Я только что закончил делать подобный проект, поэтому я уверен, что это можно сделать лучше, но это рабочее решение, если кому-то нужен один.

 Смежные вопросы

  • Нет связанных вопросов^_^