openCV for android人脸识别显示“可能不连续”错误

时间:2013-12-04 18:10:03

标签: android c++ opencv java-native-interface jpeg

我正在尝试将图像加载到openCV for Android中的Mat中以进行面部识别。

图像采用尺寸为640 x 480的jpeg格式。

我正在使用Eclipse,此代码位于.cpp文件中。

这是我的代码。

while (getline(file, line)) {
        stringstream liness(line);
        getline(liness, path, ',');
        getline(liness, classlabel);
        if(!path.empty() && !classlabel.empty()) {

            images.push_back(imread(path, 0));
            labels.push_back(atoi(classlabel.c_str()));

        }
    }

然而,我收到一个错误,说“矩阵不连续,因此它的行数不能在函数cv :: Mat cv:Mat:reshape(int,int)const中更改”

我尝试使用OpenCV 2.0 C++ API using imshow: returns unhandled exception and "bad-flag"

中的解决方案

但它在Visual Studio中。

非常感谢任何帮助。

从相机预览转换图像。

图像从相机预览数据转换为灰度。

Mat matRgb = new Mat();

Imgproc.cvtColor(matYuv, matRgb, Imgproc.COLOR_YUV420sp2RGB, 4);

try{
Mat matGray = new Mat();
Imgproc.cvtColor(matRgb, matGray, Imgproc.COLOR_RGB2GRAY, 0);
resultBitmap = Bitmap.createBitmap(640, 480, Bitmap.Config.ARGB_8888);
Utils.matToBitmap(matGray, resultBitmap);

保存图片。

ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmFace[0].compress(Bitmap.CompressFormat.JPEG, 100, stream);
byte[] flippedImageByteArray = stream.toByteArray();

1 个答案:

答案 0 :(得分:2)

“Mat not continuous”错误与您所在的链接完全无关。

如果你正在尝试渔夫或特征脸,那么这些图像必须被“压扁”为pca的一行。 这是不可能的,如果数据有“间隙”或填充以使行大小为4的倍数。一些图像编辑器会对您的数据执行此操作。

另外,imho你的图像太大了(当它几乎是二次时,pca效果最好,即rowsize(num_pixels)类似于colsize(num_images)。

因此,我的建议是,将火车图像(以及之后的测试图像)调整为100x100之类的大小,加载它们时,这也将实现连续的数据块。

(同样,避免jpegs与任何与图像处理相关的东西,压缩文件太多了!)