LoginSignup
2
1

画像の明るさを調整する【道具としての OpenCV 画像認識】

Last updated at Posted at 2024-03-14

本記事でできること

Screenshot from 2024-03-03 18-17-15.png

画像は、左上から横に、明るさバイアス
-100, -75, -50,
-25, 0, 25,
50, 75, 100
に変更したもの。(0は元画像と同じ)

想定シーン

ロボットをビジュアルフィードバック制御する

カメラを使ったロボットアームの制御方法を、ビジュアルフィードバック制御といいます。ここでは、ビジュアルフィードバック制御を使った自動化システムを開発する際に必要となる画像認識プログラムをまとめています。

画像の明るさを調整する

ロボットをビジュアルフィードバック制御する際にはカメラ画像からの情報が欠かせません。ロボットシステム設置環境によっては、照明光量が少なかったり、直射照明によってハレーション(白飛び)が発生してしまう場合があります。このとき、画像の明るさを調節するためのプログラムを掲載します。

実行環境

  • OS:Ubuntu 22.04 LTS
  • 言語:C++
  • クルーボ:v5.1.0

クルーボについて

ロボットアプリケーション開発には、株式会社チトセロボティクスのロボット制御ソフトウェア「クルーボ」を使用します。本記事のプログラムは、クルーボがインストールされた制御コンピュータ上で動作します。

プログラム抜粋

/* 明るさバイアス(推奨範囲:-100.0~100.0) */
cv::Mat adjust_brightness(const cv::Mat& image, const float brightness_bias) {
    cv::Mat colored_image = convert_colorimage(image);
    cv::Mat brightness_adjusted_image = colored_image + cv::Scalar(brightness_bias, brightness_bias, brightness_bias);
    return brightness_adjusted_image;
}

全体プログラム

#include <iostream>
#include <opencv2/opencv.hpp>

cv::Mat load_image(const std::string file_path) {
    cv::Mat loaded_image = cv::imread(file_path, 1);
    if (loaded_image.empty()) {
        throw std::runtime_error("画像を正常に読み込めませんでした。");
    }
    return loaded_image;
}

cv::Mat convert_colorimage(const cv::Mat& image) {
    const int colorimage_channel_num = 3;
    if (image.channels() == colorimage_channel_num) {
        return image.clone();
    }
    cv::Mat color_image;
    cvtColor(image, color_image, cv::COLOR_GRAY2BGR);
    return color_image;
}

/* 明るさバイアス(推奨範囲:-100.0~100.0) */
cv::Mat adjust_brightness(const cv::Mat& image, const float brightness_bias) {
    cv::Mat colored_image = convert_colorimage(image);
    cv::Mat brightness_adjusted_image = colored_image + cv::Scalar(brightness_bias, brightness_bias, brightness_bias);
    return brightness_adjusted_image;
}

int main(void) {
    std::string file_path = "../data/fuji.jpg";
    const cv::Mat loaded_image = load_image(file_path);

    /* 明るさバイアス(推奨範囲:-100.0~100.0) */
    const float brightness_bias = -25.f;
    const cv::Mat adjusted_image = adjust_brightness(loaded_image, brightness_bias);

    cv::imshow("window", adjusted_image);
    cv::waitKey(0);
}

おわりに

人手作業をロボットアームで自動化するために、カメラを使ったロボット制御=ビジュアルフィードバック制御が大切です。
ロボット制御用の画像認識でも中身のひとつひとつはシンプルなので、要素に分解して解説していきたいと思います。

2
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1