2014-04-17 65 views
0

我写我自己的算法来确定的边缘,然后找到的角点。 但是后来在转换image的时候遇到了麻烦。我写了一些代码来实现结果,但是得到了上面指定的错误。 任何人都可以帮助我请出来。 在此先感谢!java.lang.UnsupportedOperationException:垫数据类型不兼容:4

Mat mat = new Mat(w, h, CvType.CV_32S); 

    MatOfPoint2f finalc = new MatOfPoint2f(); 

    MatOfPoint2f ma = new MatOfPoint2f(); 

    mat.put(0, 0, array); 

    Mat quad = new Mat(w,h,CvType.CV_32S); 

    quad.put(0,0,w,0,w,h,0,w); 

ma.put((int)a[0][1],(int)a[0][0],(int)a[1][1],(int)a[1][0],(int)a[2][1],(int)a[2][0],(int)a[3][1],(int)a[3][0]); 

    Imgproc.approxPolyDP(ma,finalc,2.0,true); 

    Mat transmtx = Imgproc.getPerspectiveTransform(finalc, quad); 

    Imgproc.warpPerspective(mat, quad, transmtx, quad.size()); 

    MatOfByte matOfByte = new MatOfByte(); 

    Highgui.imencode(".jpg", quad, matOfByte); 

    byte[] byteArray = matOfByte.toArray(); 

    //InputStream in = new ByteArrayInputStream(byteArray); 

    //BufferedImage bufferedImage = ImageIO.read(in); 

    File f = new File("retrieve1.jpg"); 

    BufferedImage img1 = new BufferedImage(w, h, 12); 

    WritableRaster raster = (WritableRaster)img1.getData(); 

    raster.setDataElements(0,0,w,h,byteArray); 

    img1.setData(raster); 

    try 
    { 

     ImageIO.write(img1,"jpg",f); 

    } 
    catch(Exception e) 
    {} 
} 

所有我基本上试图做的是将此(C++)代码的一部分移植到java。 https://github.com/bsdnoobz/opencv-code/blob/master/quad-segmentation.cpp

+0

请格式化您的代码。并只发布相关部分。 –

+0

4是CvType.CV_32S,所以也许你的数据没有使用这种类型。 – andy

+0

@andy感谢您的回复。但是当我使用CV_8UC1我得到以下错误:OpenCV的错误:断言失败(npoints> = 0 &&(深度== CV_32S ||深度== CV_ 32F))的CV :: approxPolyDP,文件.. \ .. \ .. \ .. \的OpenCV \模块\ imgproc \ SRC \轮廓。 CPP,1871行 –

回答

0

解决方案,我创建:

Mat mat = new Mat(h,w, CvType.CV_8U); 

    mat.put(0, 0, array); 

    //Imshow is = new Imshow("try");for verification 

    MatOfPoint2f quad = new MatOfPoint2f(p);//array of corner points 

    MatOfPoint2f rect = new MatOfPoint2f(farray);//final array of corner points into which mat should be warped into 

    Mat transmtx = Imgproc.getPerspectiveTransform(quad,rect); 

    Mat output = new Mat(w,h,CvType.CV_8U); 

    Imgproc.warpPerspective(mat, output, transmtx, new Size(w,h),Imgproc.INTER_CUBIC); 

    //is.showImage(output);  

    MatOfByte matOfByte = new MatOfByte(); 

    Highgui.imencode(".jpg", output, matOfByte); 

    byte[] byteArray = matOfByte.toArray(); 

    File f = new File("retrieve1.jpg"); 

    BufferedImage img1 =null; 

    InputStream in = new ByteArrayInputStream(byteArray); 

    img1 = ImageIO.read(in); 

    WritableRaster raster = (WritableRaster)img1.getData(); 

    raster.setDataElements(0,0,byteArray); 

    img1.setData(raster); 

因为我没有需要验证的角点,因此我删除approxpolydp,把一切在为点,而不是直接将它们放入matofpoint2fs。 “数组”是正在使用的图像的字节等价物。