OpenCV + opencv_contrib を Rocky Linux 9 / AlmaLinux 9 でビルドする完全ガイド【C++】

OpenCV for C++
📌 準備: OpenCV の環境構築がまだの方はこちら → C++ 環境構築ガイドC#(OpenCvSharp)セットアップ

RHEL 9 系で OpenCV + opencv_contrib をソースビルドする

CentOS Linux 7 のサポート終了により、RHEL 系サーバーの移行先は Rocky Linux / AlmaLinux / CentOS Stream が中心になりました。この記事は 9 系(Rocky Linux 9 / AlmaLinux 9) を対象にしています。2025年には RHEL 10 系(Rocky Linux 10 / AlmaLinux 10)も出ていますが、10 系での手順は検証していません。

ただし Ubuntu 向けの手順をそのまま持ち込むと、必要な開発パッケージの一部が「見つからない」状態になります。RHEL 9 系では既定で無効になっているリポジトリがあり、そこを有効化しないと eigen3-devel すら入りません。

この記事では Rocky Linux 9(aarch64)のコンテナ上で実際に OpenCV 4.10.0 + opencv_contrib をビルドし、動画の読み込みまで確認した結果を手順にしています。

先に結論: 有効化するリポジトリが2つあります

リポジトリ 何のために要るか 有効化方法
CRB(CodeReady Builder) eigen3-developenblas-devel がここにしか無い dnf config-manager --set-enabled crb
EPEL FFmpeg の開発パッケージ(ffmpeg-free-devel)がここにある dnf install epel-release

この2つを先に済ませれば、あとは Ubuntu とほぼ同じ流れで進みます。


前提環境

実際に検証した環境です。

項目 内容
OS Rocky Linux 9(コンテナイメージ rockylinux:9 は 9.3。dnf で入るパッケージは 2026年9月時点の 9.8 リポジトリのもの)
アーキテクチャ aarch64
実行環境 Apple M2 上の Docker Desktop(コンテナに 8 CPU を割り当て)
gcc-c++ 11.5.0
cmake 3.31.8
OpenCV / opencv_contrib 4.10.0(タグを一致させる)

AlmaLinux 9 でも同じ手順が通ることを確認済みです(eigen3-devel 3.4.0 / openblas-devel 0.3.29 が crb、ffmpeg-free-devel 5.1.9 が epel と、提供元もバージョンも Rocky Linux 9 と一致しました)。RHEL 9 本体の場合だけ注意が必要で、CRB に相当するリポジトリ名が codeready-builder-for-rhel-9-<arch>-rpms となり、サブスクリプションでの有効化が必要になります。また RHEL 本体には epel-release パッケージが無いため、EPEL は Fedora Project が配布する RPM を直接入れます(EPEL の公式手順)。

subscription-manager repos --enable codeready-builder-for-rhel-9-$(arch)-rpms
dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm

コマンドはコンテナ内(root)での実行例です。一般ユーザーで実行する場合は sudo を付けてください。


手順

1. リポジトリの有効化

まずここから始めます。順番を逆にすると、パッケージが見つからず調べ回ることになります。

dnf -y install dnf-plugins-core
dnf -y install epel-release
dnf config-manager --set-enabled crb

有効になったことを確認します。

dnf repolist
repo id             repo name
appstream           Rocky Linux 9 - AppStream
baseos              Rocky Linux 9 - BaseOS
crb                 Rocky Linux 9 - CRB
epel                Extra Packages for Enterprise Linux 9 - aarch64
epel-cisco-openh264 Extra Packages for Enterprise Linux 9 openh264
extras              Rocky Linux 9 - Extras

crbepel の2行があれば準備完了です。

2. 依存パッケージの導入

dnf -y install \
    gcc-c++ cmake git make pkgconf-pkg-config \
    libjpeg-turbo-devel libpng-devel libtiff-devel \
    python3-devel openblas-devel eigen3-devel \
    gtk3-devel ffmpeg-free-devel \
    tar gzip

どのパッケージがどのリポジトリから来るかを実際に調べた結果です。

パッケージ 提供元
gcc-c++ / cmake / make / libjpeg-turbo-devel / libpng-devel / libtiff-devel / gtk3-devel baseos・appstream(既定で有効)
eigen3-devel(3.4.0) / openblas-devel(0.3.29) crb
ffmpeg-free-devel(5.1.9) epel

⚠️ ffmpeg-devel という名前のパッケージはありません。 RHEL 9 系の EPEL が提供するのは ffmpeg-free-devel です(特許周りの都合で一部コーデックを除いた構成)。dnf install ffmpeg-develNo match for argument で失敗します。Ubuntu の libavcodec-dev 等に相当するのはこのパッケージです。

3. ソースコードの取得

本体と contrib は必ず同じタグにします。

cd /root
OPENCV_VERSION=4.10.0

curl -sL -o opencv.tar.gz \
  https://github.com/opencv/opencv/archive/refs/tags/${OPENCV_VERSION}.tar.gz
curl -sL -o opencv_contrib.tar.gz \
  https://github.com/opencv/opencv_contrib/archive/refs/tags/${OPENCV_VERSION}.tar.gz

tar xzf opencv.tar.gz
tar xzf opencv_contrib.tar.gz

4. CMake 構成

mkdir -p /root/build && cd /root/build

cmake /root/opencv-4.10.0 \
  -DCMAKE_BUILD_TYPE=Release \
  -DCMAKE_INSTALL_PREFIX=/usr/local \
  -DOPENCV_EXTRA_MODULES_PATH=/root/opencv_contrib-4.10.0/modules \
  -DOPENCV_ENABLE_NONFREE=ON \
  -DOPENCV_GENERATE_PKGCONFIG=ON \
  -DBUILD_LIST=core,imgproc,imgcodecs,videoio,features2d,calib3d,flann,xfeatures2d,ximgproc \
  -DBUILD_TESTS=OFF \
  -DBUILD_PERF_TESTS=OFF \
  -DBUILD_EXAMPLES=OFF \
  -DBUILD_opencv_python3=OFF \
  -DBUILD_opencv_apps=OFF

確認すべき出力Video I/O セクションです。リポジトリの設定が正しければこうなります。

--   Video I/O:
--     FFMPEG:                      YES
--       avcodec:                   YES (59.37.100)
--       avformat:                  YES (59.27.100)
--       avutil:                    YES (57.28.100)
--       swscale:                   YES (6.7.100)
--     GStreamer:                   NO
--     v4l/v4l2:                    YES (linux/videodev2.h)

ここが FFMPEG: NO なら、ffmpeg-free-devel が入っていないか EPEL が有効になっていません。ビルドしてから気づくと 4 分が無駄になるので、必ずこの時点で確認してください。

オプション 意味
OPENCV_EXTRA_MODULES_PATH contrib モジュールのパス
OPENCV_ENABLE_NONFREE=ON SURF など特許関連アルゴリズムを有効化
OPENCV_GENERATE_PKGCONFIG=ON opencv4.pc を生成する(OpenCV 4 系は既定 OFF)
BUILD_LIST ビルドするモジュールを限定。サーバー用途では絞ると効果が大きい

5. ビルドとインストール

make -j$(nproc)
make install

上記の BUILD_LIST(9モジュール)で、8 CPU の環境で実測 3分49秒でした。

6. 共有ライブラリのパスを通す

RHEL 系は /usr/local/lib64 にインストールされますが、このパスは既定で ldconfig に登録されていません。登録しないと実行時に .so が見つかりません。

echo "/usr/local/lib64" > /etc/ld.so.conf.d/opencv.conf
ldconfig

動作確認

静止画・動画・contrib をまとめて確認します。

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/videoio.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/ximgproc.hpp>
#include <iostream>

int main()
{
    std::cout << "OpenCV " << CV_VERSION << std::endl;

    // [1] 静止画
    cv::Mat img(240, 320, CV_8UC3, cv::Scalar(30, 120, 220));
    cv::imwrite("out.png", img);
    cv::Mat r = cv::imread("out.png");
    std::cout << "[1] imwrite/imread: " << (r.empty() ? "NG" : "OK") << std::endl;

    // [2] 動画(FFmpeg バックエンドの有無がここに出る)
    cv::VideoCapture cap("test.mp4");
    std::cout << "[2] VideoCapture(mp4): "
              << (cap.isOpened() ? "OK" : "NG") << std::endl;

    // [3] contrib + NONFREE
    auto surf = cv::xfeatures2d::SURF::create();
    std::cout << "[3] contrib SURF: OK" << std::endl;

    // [4] contrib の別モジュール
    cv::Mat gray, thin;
    cv::cvtColor(r, gray, cv::COLOR_BGR2GRAY);
    cv::ximgproc::thinning(gray, thin, cv::ximgproc::THINNING_ZHANGSUEN);
    std::cout << "[4] contrib ximgproc: OK" << std::endl;

    return 0;
}

test.mp4 は FFmpeg のある PC で作って持ち込みます。

ffmpeg -f lavfi -i testsrc=duration=1:size=320x240:rate=10 -c:v mpeg4 -pix_fmt yuv420p test.mp4
export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig
g++ -std=c++17 check.cpp -o check $(pkg-config --cflags --libs opencv4)
./check

Rocky Linux 9 での実行結果です。

OpenCV 4.10.0
[1] imwrite/imread: OK
[2] VideoCapture(mp4): OK
[3] contrib SURF: OK
[4] contrib ximgproc: OK

すべて通ります。

⚠️ ただし HEVC(H.265)の動画は開けません

EPEL の ffmpeg-free は特許の関係で一部のデコーダを外した構成です。「mp4 が開ける」がどのコーデックまでを指すのか、同じ映像を5種類のコーデックで作って isOpened() と1フレーム目の read() を確かめました。

コーデック Rocky Linux 9
MPEG-4 Part 2(mpeg4 ✅ 読める
H.264(libx264 ✅ 読める
H.265 / HEVC(libx265 開けない
VP9 ✅ 読める
AV1 ✅ 読める

H.264 は Cisco の OpenH264(openh264 パッケージ)を経由して復号されます。openh264libavcodec-free弱い依存(Recommends)なので、dnf の既定設定なら epel-cisco-openh264 リポジトリから自動で入ります。ただし、コンテナを小さくするために --setopt=install_weak_deps=False を付けている場合は入らず、H.264 が読めなくなります。その場合は dnf install openh264 を明示してください。iPhone で撮影した動画など HEVC の素材を扱う場合、この構成では読めないので、事前に H.264 へ変換するなどの対応が必要です。


Amazon Linux 2023 との違い

AWS 上で動かす場合、ベース OS の候補に Amazon Linux 2023(AL2023)が入ります。dnf を使う点は同じですが、AL2023 は Fedora 系で独自のリポジトリ構成を持っており、OpenCV のビルドに関しては決定的な差があります。まったく同じ CMake オプション・同じ確認プログラムで比較した結果です。

Rocky Linux 9 Amazon Linux 2023
EPEL dnf install epel-release で導入できる 非対応epel-release が存在しない)
CRB dnf config-manager --set-enabled crb — (既定リポジトリに含まれる)
FFmpeg 開発パッケージ ffmpeg-free-devel(EPEL・5.1.9) 入手できない
FFMPEG YES NO
cv::VideoCapture で mp4(MPEG-4 / H.264 / VP9 / AV1) 開ける 開けない
cv::VideoCapture で mp4(HEVC) 開けない 開けない
静止画・contrib OK OK

動画ファイルを扱う必要があるかどうかが、そのまま OS 選定の分岐点になります。 AL2023 側の詳細と回避策は OpenCV + opencv_contrib を Amazon Linux 2023 でビルドする完全ガイド【C++】 にまとめています。


つまずきポイント

⚠️ dnf install ffmpeg-devel が失敗する

RHEL 9 系で提供されるのは ffmpeg-free-devel です。名前が違うだけで、OpenCV のビルドにはこれで足ります。

⚠️ CRB を有効化せずに進めて eigen3-devel が見つからない

No match for argument: eigen3-devel
Error: Unable to find a match: eigen3-devel

CRB(CodeReady Builder)は RHEL 系で開発用パッケージを集めた、既定で無効のリポジトリです。OpenCV に限らず、ソースビルド全般でここを有効化する場面が出てきます。なお dnf config-managerdnf-plugins-core に含まれるので、先にそれを入れる必要があります。

⚠️ CentOS Stream 9 での違い

CentOS Stream 9 は RHEL 9 の上流にあたるため、パッケージのバージョンが本記事の実測より新しいことがあります。手順自体は同じです。リポジトリ名も crb で共通です。

⚠️ lib ではなく lib64

Ubuntu 向けの手順をそのまま使うと /usr/local/lib を見に行って見つかりません。RHEL 系は /usr/local/lib64 です。PKG_CONFIG_PATH も ldconfig の設定もこちらを指定してください。


まとめ

  • RHEL 9 系では CRB と EPEL の2つを先に有効化するeigen3-developenblas-devel は CRB、FFmpeg は EPEL から来る
  • FFmpeg の開発パッケージ名は ffmpeg-free-develffmpeg-devel は存在しない
  • CMake 構成後、FFMPEG: YES になっているかをビルド前に確認する
  • /usr/local/lib64 を ldconfig に登録する
  • BUILD_LIST で絞れば 8 CPU で 4 分弱でビルドできる
  • H.264 / VP9 / AV1 は読めるが、HEVC(H.265)は読めない
  • 動画を扱うなら、Amazon Linux 2023 ではなく RHEL 9 系を選ぶ判断になる

他のプラットフォームでの手順は OpenCV + opencv_contrib を Ubuntu でビルドする完全ガイド【C++】 を参照してください。ビルド後に CMake プロジェクトから使う方法は CMake で OpenCV をリンクする方法【find_package 完全ガイド・C++】 にまとめています。

🛠 画像処理のプロが開発するSDK/API

本ブログを運営するスワローインキュベートは、OpenCV ベースのなりすまし判定SDK/API(C++製・OpenCV 4.10)を開発しています。顔認証システムへの組み込み実績多数。

→ なりすまし判定SDK/APIの詳細を見る
→ API仕様書・サンプルコード

タイトルとURLをコピーしました