2014-10-03 211 views
0

我试图将rgb图像的颜色空间从RGB转换为HSV。我用下面的代码:将图像的颜色空间从RGB转换为HSV

public class Main { 
    public static void main(String[] args) 
    { 
    try{ 
     System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 
     File input = new File("H:/Development/workspace/label.png"); 
     BufferedImage image = ImageIO.read(input); 
     byte[] data=extractBytes(image);  
     Mat mat = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC2); 
     mat.put(0, 0, data); 

     Mat mat1 = new Mat(image.getHeight(),image.getWidth(),CvType.CV_8UC2); 
     Imgproc.cvtColor(mat, mat1, Imgproc.COLOR_RGB2HSV); 

     byte[] data1 = new byte[mat1.rows()*mat1.cols()*(int)(mat1.elemSize())]; 
     mat1.get(0, 0, data1); 
     BufferedImage image1 = new BufferedImage(mat1.cols(), mat1.rows(), 5); 
     image1.getRaster().setDataElements(0,0,mat1.cols(),mat1.rows(),data1); 

     File ouptut = new File("H:/Development/workspace/label_hsv.png"); 
     ImageIO.write(image1, "png", ouptut); 
     } catch (Exception e) { 
     // System.out.println("Failed"); 
      System.out.println("Error: " + e.getMessage()); 
      e.printStackTrace(); 
     } 
    } 
    public static byte[] extractBytes (BufferedImage bufferedImage) throws IOException { 
     WritableRaster raster = bufferedImage .getRaster(); 
     DataBufferByte data = (DataBufferByte) raster.getDataBuffer(); 

     return (data.getData()); 
     } 
} 

但它失败了一些错误:断言失败

OpenCV Error: Assertion failed ((scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F)) in cv::cvtColor, file ..\..\..\..\opencv\modules\imgproc\src\color.cpp, line 3959 
CvException [org.opencv.core.CvException: cv::Exception: ..\..\..\..\opencv\modules\imgproc\src\color.cpp:3959: error: (-215) (scn == 3 || scn == 4) && (depth == CV_8U || depth == CV_32F) in function cv::cvtColor 
] 
    at org.opencv.imgproc.Imgproc.cvtColor_1(Native Method) 
    at org.opencv.imgproc.Imgproc.cvtColor(Imgproc.java:4598) 
    at com.pradeep.exper.Main.main(Main.java:28) 

任何帮助为什么它是怎么回事?

+1

CvType.CV_8UC2 //应该是CvType.CV_8UC3。另外,为什么不使用Highgui.imread(),并保存大量的位图转换? – berak 2014-10-03 08:37:39

+0

你也只需要Mat mat1 = new Mat();为cvtColor输出 – berak 2014-10-03 08:38:42

回答

5

到目前为止,你的程序可以归结为一个简单的:

public class Main { 
    public static void main(String[] args) { 
     System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 

     Mat bgr = Highgui.imread("H:/Development/workspace/label.png"); 
     Mat hsv = new Mat(); 
     Imgproc.cvtColor(bgr, hsv, Imgproc.COLOR_RGB2HSV); 
     Highgui.imwrite("H:/Development/workspace/label_hsv.png"); 
    } 
} 
+0

感谢berak..it为我工作 – PK10 2014-10-03 08:57:28