在GetOpenFileName()对话框之后,cv :: imread()无法使用.jp2文件

时间:2018-09-15 13:50:27

标签: c++ opencv winapi jpeg2000

我遇到了一个我似乎无法解决的奇怪问题,涉及到OpenCV,Win32 API和jpeg2000文件格式。

我制作了一个C ++程序,要求图像,然后将其用作纹理,对其进行操作等。但这是问题所在:

我用OPENFILENAME和GetOpenFileName()请求图像文件的路径。这是此非常基本格式的示例代码:

#include "pch.h"
#include <iostream>
#include <opencv2/opencv.hpp>
#include <Windows.h>


void SelectAndOpenImage()
{
    OPENFILENAME openFile;
    char filePath[MAX_PATH] = { 0 };

    ZeroMemory(&openFile, sizeof(OPENFILENAME));

    openFile.lStructSize = sizeof(OPENFILENAME);
    openFile.hwndOwner = NULL;
    openFile.lpstrFile = filePath;
    openFile.lpstrFile[0] = '\0';
    openFile.nMaxFile = MAX_PATH;
    openFile.lpstrFilter = "Jpeg2000 (*.jp2)\0*.jp2\0Bitmap (*.bmp)\0*.bmp\0Jpeg (*.jpg)\0*.jpg\0Png (*.png)\0*.png\0";
    openFile.nFilterIndex = 1;
    openFile.lpstrInitialDir = NULL;
    openFile.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_NOCHANGEDIR;

    if (GetOpenFileName(&openFile))
    {
        cv::Mat image = cv::imread(openFile.lpstrFile, CV_LOAD_IMAGE_COLOR);
        if (image.empty()) std::cout << "Empty" << std::endl;
        else
        {
            cv::imshow("testing", image);
            cv::waitKey(5000);
        }
    }
    else
    {
        std::cout << "Failure" << std::endl;
    }
}


int main()
{
    SelectAndOpenImage();
    return 0;
}

问题是cv :: imread()对于除Jpeg2000以外的每种图像文件格式均能正常工作,cv :: imshow()仅显示黑色图像(数据为零)。如果我根本不使用此GetOpenFileName()对话框,那么Jpeg2000可以与其他语言一起很好地工作(相反,我只是将文件路径直接插入源代码中)。但是,如果我使用对话框但忽略文件选择,而是使用自己的硬编码文件路径,则Jpeg2000文件格式将不起作用,然后也将变为空白的黑色图像。不管我怎么做,所有其他图像文件格式都可以工作。

我欢迎所有想法。我丢失了一些东西。

我当前正在使用Windows10和Visual Studio 2017版本15.8.2(MSVC ++ 14.15)。 OpenCV是3.4.2(发布)。

0 个答案:

没有答案