3

我正在使用相机在使用 Android 4.03 和 opencv for android 2.4.3 的手机上捕捉图像

在我的应用程序中,我正在使用 Highgui.imread 从磁盘读取图像

但问题是该功能总是旋转图像与实际保存的图像形成对比!

if (requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE) {
        if (resultCode == RESULT_OK) {
            Mat img = Highgui.imread(file.getAbsolutePath());
            if(img!=null)
                n.detectDocument(img.getNativeObjAddr());

在本地

jbyteArray JNICALL Java_com_example_superemr_NSuperEMR_detectDocument(JNIEnv *env, jobject object, jlong addr)
{
    Mat* image = (Mat*) addr;
    imwrite("/mnt/sdcard/work/hala.jpg",*image);
    return NULL;
}

如何在正确的位置读取图像?

4

2 回答 2

1

imread 对 JPG 元数据的解码方式与您使用的图像查看器不同。

手机照片设置了“方向” EXIF。这可以在 Chrome 中看到,在 tinypic 上带有photo1photo2

不确定如何在 C++ 中正确读取和处理 EXIF 标志,但在 python 中存在类似问题

还没有尝试过,但您可以考虑使用另一个库读取图像,保存为 png,然后读入 opencv。

PS:看到这是一个旧帖子,但是当我遇到同样的问题时,它出现在我的搜索结果中,所以也许它会对其他人有所帮助。

于 2014-08-30T22:13:13.407 回答
0

您可以使用 imagemagick 首先自动定位图像。这会将方向元数据更改为 1(或左上角)并更改图像的方向(旋转和镜像,视需要而定)。

检查方向元数据:identify -format '%[exif:orientation]'

自动定向图像:转换 -auto-orient

于 2016-03-08T05:30:54.157 回答