android:如何将int[]转换为OpenCV Mat c++

android: How to convert an int[] to an OpenCV Mat c++?

本文关键字:转换 OpenCV Mat c++ int android      更新时间:2023-10-16

我试图使用openCV对从onPreviewFrame(byte[] rawData)返回的数组进行一些图像处理,我已将字节数组转换为int数组。

我的问题是,如何将这个int数组转换为Iplimage或Mat ?换用新的Camera2会有什么好处吗?

我已经尝试用这种方法来转换数组。

void ProcImage(int Width, int Height, int imageArray[]) {
cv::Mat mat = cv::Mat(Width, Height, CV_32SC1 , imageArray);
}

but mat.data包含像-14545898这样的值。有解决方案吗?提前感谢

这很可能是由于您使用的Mat类型CV_32SC1。您甚至不需要转换int数组,并使用字节数组

cv::Mat mat = new cv::Mat(Width, Height, CvType.CV_8UC3, byteArray);

其中byteArray为字节数组。

如果您仍然想使用int数组尝试更改类型为Mat: CV_32SC1,CV_32SC2,CV_32SC3,CV_32SC4之一,如http://ninghang.blogspot.com/2012/11/list-of-mat-type-in-opencv.html

直接在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);
}