将图像的颜色空间从RGB转换为HSV
问题描述:
我试图将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)
任何帮助为什么它是怎么回事?
答
到目前为止,你的程序可以归结为一个简单的:
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
CvType.CV_8UC2 //应该是CvType.CV_8UC3。另外,为什么不使用Highgui.imread(),并保存大量的位图转换? – berak 2014-10-03 08:37:39
你也只需要Mat mat1 = new Mat();为cvtColor输出 – berak 2014-10-03 08:38:42