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-devel・openblas-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
crb と epel の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-develはNo 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 パッケージ)を経由して復号されます。openh264 は libavcodec-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-manager は dnf-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-devel・openblas-develは CRB、FFmpeg は EPEL から来る - FFmpeg の開発パッケージ名は
ffmpeg-free-devel。ffmpeg-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)を開発しています。顔認証システムへの組み込み実績多数。

