1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

画像が真っ黒かどうか判定する【道具としての OpenCV 画像認識】

Last updated at Posted at 2024-03-18

本記事でできること

image.png

想定シーン

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

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

画像が真っ黒かどうか判定する

OpenCVの関数のいくつかには、画像が真っ黒な場合にはプログラムが意図通り動作しないものがあります。たとえば、画像内の物体をラベリングする関数や、物体の数を数える関数などです。本記事では、画像が真っ黒(白い領域がひとつもない)かどうかを判定するプログラムを掲載します。ロボットのビジュアルフィードバック制御アプリケーションを作成する際のヘルパー関数として使用すると便利だと思います。

実行環境

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

クルーボについて

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

プログラム抜粋

bool is_black_image(const cv::Mat& image) {
    cv::Mat image_gray = convert_grayscale(image);
    int count_non_zero_pizels = cv::countNonZero(image_gray);
    if (count_non_zero_pizels == 0) {
        return true;
    } else {
        return false;
    }
}

全体プログラム

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

cv::Mat convert_grayscale(const cv::Mat& image) {
    const int grayscale_channel_num = 1;
    if (image.channels() == grayscale_channel_num) {
        return image.clone();
    }
    cv::Mat gray_image;
    cvtColor(image, gray_image, cv::COLOR_BGR2GRAY);
    return gray_image;
}

bool is_black_image(const cv::Mat& image) {
    cv::Mat image_gray = convert_grayscale(image);
    int count_non_zero_pizels = cv::countNonZero(image_gray);
    if (count_non_zero_pizels == 0) {
        return true;
    } else {
        return false;
    }
}

cv::Mat invert_image(const cv::Mat& image) {
    cv::Mat gray_image = convert_grayscale(image);
    cv::Mat inverted_image;
    cv::bitwise_not(gray_image, inverted_image);
    return inverted_image;
}

int main(void) {
    const cv::Size image_size(1280, 960);
    const cv::Mat black_image = cv::Mat::zeros(image_size.height, image_size.width, CV_8UC3);
    const cv::Mat white_image = invert_image(black_image);

    std::cout << "black_image is black image? : " << std::boolalpha << is_black_image(black_image) << std::endl;
    std::cout << "white_image is black image? : " << std::boolalpha << is_black_image(white_image) << std::endl;

    return 0;
}

実行結果

black_image is black image? : true
white_image is black image? : false

おわりに

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

1
1
3

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
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?