将打开的cv mat转换为整数数组
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将打开的cv mat转换为整数数组相关的知识,希望对你有一定的参考价值。
我正在尝试将CV_8UC3(RGB)类型的开放式cv垫转换为整数数组。
void copyMatToJIntArray(Mat m,jint* jia)
{
Mat tempMat;
cvtColor(m,tempMat,CV_BGRA2RGB);
jint size = tempMat.rows*tempMat.cols* tempMat.elemSize();
u_char * uchars = new u_char[size];
for(int r=0;r<tempMat.rows;r++)
{
for(int c=0;c<tempMat.cols;c++)
{
u_char r=*(tempMat.data+ r*tempMat.step + c);
u_char g=*(tempMat.data+ r*tempMat.step + c+1);
u_char b=*(tempMat.data+ r*tempMat.step + c+2);
uchars[r*tempMat.step+c]=r;
uchars[r*tempMat.step+c+1]=g;
uchars[r*tempMat.step+c+2]=b;
}
}
for (int i = 0; i < tempMat.rows*tempMat.cols; i++)
{
jia[i] = uchars[i];
}
}
我通过JNI将这个整数数组传递给android java,在那里它被转换成一个位图
croppedImageBitmap.setPixels(BGRA, 0, width, 0, 0, width, height);
imageView1.setImageBitmap(croppedImageBitmap);
但是当我在我的Android测试手机上查看它时,图像上有一个蓝色调
答案
我不知道Java
,但它几乎与opencv
中的c++
相同,你可以使用我的c++
版本:
typedef std::vector<std::vector<int> > Matrix;
Matrix int_Im(3, std::vector<int>(m.cols*m.rows,0));
Matrix copyMatToJIntArray(Mat m,jint* jia)
{
for(auto j=0, k = 0;j<m.rows;j++)
for(auto i=0;i<m.cols;i++)
{
int_Im[k][0] = m.at<uchar>(j,i)[0];
int_Im[k][1] = m.at<uchar>(j,i)[1];
int_Im[k][2] = m.at<uchar>(j,i)[2];
k++;
}
return int_Im;
}
另一答案
试试这个
jintArray resultImage = env->NewIntArray(h.total());
jint *_data = new jint[h.total()];
for (int i = 0; i < h.total(); i++) {
char b = h.data[h.channels() * i];
char g = h.data[h.channels() * i + 1];
char r = h.data[h.channels() * i + 2];
char a = 255;
_data[i] = (((jint) a << 24) & 0xFF000000) + (((jint) r << 16) & 0x00FF0000) +
(((jint) g << 8) & 0x0000FF00) + ((jint) b & 0x000000FF);
}
env->SetIntArrayRegion(resultImage, 0, h.total(), _data);
delete[]_data;
在你的java方面
int[] result = yourfunction();
Bitmap bitmap = Bitmap.createBitmap(result, yourimagewidth, yourimageheight, Bitmap.Config.ARGB_8888);
另一答案
根据此table,数组数据格式应与Mat的类型相对应
public static Mat arrayToMat(double[][] array,int height, int width, int matType)
{
Mat image = new Mat(height,width,matType);
for (int i=0; i<height; i++)
{
for (int j=0; j<width; j++)
{
image.put(i,j,array[i][j]);
}
}
return image;
}
public static double[][] matToArray(Mat frame)
{
double array[][] = new double[frame.height()][frame.width()];
for (int i=0; i < frame.height(); i++)
{
for (int j=0; j < frame.width(); j++)
{
array[i][j] = frame.get(i,j)[0];
}
}
return array;
}
以上是关于将打开的cv mat转换为整数数组的主要内容,如果未能解决你的问题,请参考以下文章
将 arm_compute::Image 转换为 cv::Mat
使用 QImage::loadFromData 将 cv::mat 转换为 QImage