**目的と現状**  
OpenCVでjp2の画像を表示したいのですが、エラーになります。  
jpegなどは読み取れるようです。  
原因がわからないため教えていただきたいです。

**環境**  
ubuntuでpython3を用いています。

**ソースコード**

```

    import os
    import cv2
    os.environ["OPENCV_IO_ENABLE_JASPER"] = "True"
    
    #パス
    path_b4 = ('T53SLV_20190504T014701_B04_10m.jp2')
    
    #元の画像を読み込む
    img = cv2.imread(path_b4, cv2.IMREAD_COLOR)
    
    #ウィンドウに表示
    cv2.imshow("MAP", img)
    
    #終了処理
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
```

**エラーメッセージ**

```

    imread_('T53SLV_20190504T014701_B04_10m.jp2'): can't read header: OpenCV(4.2.0) /io/opencv/modules/imgcodecs/src/grfmt_jpeg2000.cpp:196: error: (-215:Assertion failed) depth == 8 || depth == 16 in function 'readHeader'
    
    Traceback (most recent call last):
      File "chap5.py", line 15, in <module>
        cv2.imshow("MAP", img)
    cv2.error: OpenCV(4.2.0) /io/opencv/modules/highgui/src/window.cpp:376: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'imshow'
    
```

**試したこと**  
上記プログラムでjpegやpngファイルで試してみたところ画像が表示されました。  
また別の開き方では画像が開けたのでjp2画像自体は問題ないと思われます。  
以下にjp2を開くことのできたコードを示します。

```

    import os
    import matplotlib.pyplot as plt
    import numpy as np
    from PIL import Image
    
    #絶対パス
    path_b4 = ('T53SLV_20190504T014701_B04_10m.jp2')
    
    #jp2画像の読み込み
    im = Image.open(path_b4)
    
    #画像を配列に変換
    im_list = np.array(im)
    
    #コンター図作成
    plt.imshow(im_list, cmap="jet")
    plt.colorbar () 
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.show()
    
```

**補足情報**  
jp2の画像が必要なのでフォーマットの変換なしでの方法を知りたいです。  
jp2画像は(10980, 10980)の大きさです。
CC BY-SA 4.0
2020-11-19T06:17:09.260
72057
2023-06-20T07:03:00.500
42786
question
python python3 opencv
pythonのOpenCVを用いたjp2画像の表示
**訂正して先頭に追記：**

その後継続して検索してみたところでは、OpenCVのドキュメントによるとOS環境の違いが影響している可能性の方が高そうで、Unix系オープンソースOSでは対応コーデックを別途入れる必要があるようです。  
[Mat imread(const string& filename, int
flags=1)](http://opencv.jp/opencv-2.2/cpp/highgui_reading_and_writing_images_and_video.html?highlight=imread#imread)

>   * JPEG 2000 files - *.jp2 （ **注意2** を参照してください）
>

>
> **注意2** : Windows と MacOSX 環境では，OpenCVで使われる標準の画像コーデック（libjpeg, libpng,
> libtiff そして libjasper）がデフォルトで利用されます．よって，OpenCVは常に JPEGs, PNGs, TIFFs
> を読み込むことができます．MacOSXでは，ネイティブなMacOSX画像ローダを利用するためのオプションもあります．しかし現在は，MacOSXに組み込まれたカラーマネジメントにより，これらのネイティブな画像ローダを利用すると，画像のピクセル値が多少異なるものになることに注意してください．
>
> Linux, BSD系，その他のUnix系のオープンソースOS環境では，OpeNCV は OSが提供する画像コーデックを探します．
> **コーデックのサポートを得るために，関連パッケージを（開発ファイル，例えば「libjpeg-
> dev」など，を忘れずに）インストールするか，あるいは，CMakeで OPENCV_BUILD_3RDPARTY_LIBS を ON
> にしてください．**

上記最後の太字化は引用者

また参考としてopencv-pythonはC++のコードを呼んでいるだけですという記述  
[Bug in python version of imwrite w/ 16bit JPEG2000
#384](https://github.com/skvark/opencv-python/issues/384)

> There is no "python version" of OpenCV, Python just calls the C++ code. Open
> an issue to the OpenCV repository, this repository contains only a build
> toolchain and I cannot fix OpenCV bugs here.
>
> https://github.com/opencv/opencv/issues

あと今のOpenCVはjasperではなくOpenJPEGに移行しているという記述  
[Bug in imwrite w/ 16bit JPEG2000
#18263](https://github.com/opencv/opencv/issues/18263)

> BTW, OpenCV is migrating on OpenJPEG decoder/encoder (instead of Jasper).

* * *

**以下は対処の一部としては有りかも？だが本質では無さそう**

単純に環境変数の設定とcv2のimportの順番が逆なのでは？ (加えてOpenCVの版数の問題かも？)  
Python 3.8.6 と OpenCV 4.4.0.46 で質問のソースの順番で実行すると：

```

    import cv2
    os.environ["OPENCV_IO_ENABLE_JASPER"] = "True"
    
```

こんなエラーが発生しました。

```

    [ WARN:0] global C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-71670poj\opencv\modules\imgcodecs\src\grfmt_jpeg2000.cpp (103) cv::initJasper imgcodecs: Jasper (JPEG-2000) codec is disabled. You can enable it via 'OPENCV_IO_ENABLE_JASPER' option. Refer for details and cautions here: https://github.com/opencv/opencv/issues/14058
    Traceback (most recent call last):
      File "jp2.py", line 9, in <module>
        img = cv2.imread(path_b4, cv2.IMREAD_COLOR)
    cv2.error: OpenCV(4.4.0) C:\Users\appveyor\AppData\Local\Temp\1\pip-req-build-71670poj\opencv\modules\imgcodecs\src\grfmt_jpeg2000.cpp:104: error: (-213:The function/feature is not implemented) imgcodecs: Jasper (JPEG-2000) codec is disabled. You can enable it via 'OPENCV_IO_ENABLE_JASPER' option. Refer for details and cautions here: https://github.com/opencv/opencv/issues/14058 in function 'cv::initJasper'
    
```

順番を変えてこちらで実行すると、表示されます。

```

    os.environ["OPENCV_IO_ENABLE_JASPER"] = "True"
    import cv2
    
```

データはここの  
[経葉デジタルアーカイブ | ダウンロード | JuGeMu JPEG 2000
...](http://www.keiyou.jp/archive/download/index.html)

JPEG 2000画像サンプル
[江戸古地図](http://www.keiyou.jp/archive/download/%E6%B1%9F%E6%88%B8%E5%8F%A4%E5%9C%B0%E5%9B%B3.zip)

を使いました。
CC BY-SA 4.0
2020-11-19T07:02:40.110
72058
2020-11-24T12:58:38.347
2020-11-24T12:58:38.347
26370
26370
72057
answer