我试图在onPreviewFrame(byte [] rawData)返回的数组上使用openCV进行一些图像处理,我已经将字节数组转换为int数组。
我的问题是,如何将这个int数组转换成Iplimage或Mat? 将转换为新的Camera2有什么好处?
我试过这种方式来转换数组。
void ProcImage(int Width, int Height, int imageArray[]) {
cv::Mat mat = cv::Mat(Width, Height, CV_32SC1 , imageArray);
}
但mat.data包含的值为-14545898。 任何解决方案 提前谢谢
答案 0 :(得分:0)
这很可能是由于您使用的Mat类型CV_32SC1
。
您甚至不必转换int数组,并按原样使用字节数组
cv::Mat mat = new cv::Mat(Width, Height, CvType.CV_8UC3, byteArray);
其中byteArray
是你的字节数组。
如果您仍想使用int数组,请尝试将类型更改为http://ninghang.blogspot.com/2012/11/list-of-mat-type-in-opencv.html
中指定的Mat: CV_32SC1,CV_32SC2,CV_32SC3,CV_32SC4
之一
答案 1 :(得分:0)
直接在Java中你可以做这样的事情(它基于JavaCameraView的实现):
...
Mat frameData = new Mat(frameHeight + (frameHeight/2), frameWidth, CvType.CV_8UC1);
@Override
public void onPreviewFrame(byte[] frame, Camera arg1) {
Log.d(TAG, "Preview Frame received. Frame size: " + frame.length);
synchronized (this) {
frameData.put(0, 0, frame);
...
this.notify();
}
}
public Mat getRgbaFrame() {
Mat rgba = new Mat();
Imgproc.cvtColor(frameData, rgba, Imgproc.COLOR_YUV2RGBA_NV21, 4);
return mRgba;
}
public Mat getGrayFrame() {
return frameData.submat(0, frameHeight, 0, frameWidth);
}