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

Posted

技术标签:

【中文标题】android:如何将 int[] 转换为 OpenCV Mat c++?【英文标题】:android: How to convert an int[] to an OpenCV Mat c++? 【发布时间】:2016-10-25 18:47:39 【问题描述】:

我尝试使用 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);

但是 mat.data 包含像 -14545898 这样的值。 任何解决方案? 提前致谢

【问题讨论】:

【参考方案1】:

这很可能是由于您使用的 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 中指定的那样

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于android:如何将 int[] 转换为 OpenCV Mat c++?的主要内容,如果未能解决你的问题,请参考以下文章

android - 如何将 int 转换为字符串并将其放在 EditText 中?

如何在android中把JSON对象转换为string

如何在Android中将double转换为int? [复制]

Android:将 String 转换为 int

将 EditText 转换为 int? (安卓)

无论如何在Android中将Drawable转换为int