LoginSignup
1
1

画像内の2点間の角度を測る【道具としての OpenCV 画像認識】

Last updated at Posted at 2024-03-21

本記事でできること

Screenshot from 2024-03-10 10-54-40.png

想定シーン

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

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

画像内の2点間の角度を測る

カメラ画像から、画像内での2点間について、画像の横軸に対しての角度を知りたい場合があります。本記事では、画像内の2点間の角度を測るプログラムを掲載します。

実行環境

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

クルーボについて

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

プログラム抜粋

注意点:角度の計測基点は画像左側からになります。これは、OpenCVの画像の原点が左上にあることが理由です。

float RAD2DEG(const float radian) { return radian * (180.f / static_cast<float>(M_PI)); }

float get_angle(const cv::Point start, const cv::Point finish) {
    const float radian = atan2(static_cast<float>((finish.y - start.y)), static_cast<float>(-(finish.x - start.x)));
    return RAD2DEG(radian);
}

全体プログラム

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

float RAD2DEG(const float radian) { return radian * (180.f / static_cast<float>(M_PI)); }

float get_angle(const cv::Point start, const cv::Point finish) {
    const float radian = atan2(static_cast<float>((finish.y - start.y)), static_cast<float>(-(finish.x - start.x)));
    return RAD2DEG(radian);
}

int main(void) {
    cv::Point point_1(100, 100);
    cv::Point point_2(850, 770);

    const float result_angle = get_angle(point_1, point_2);
    std::cout << "angle : " << result_angle << std::endl;
}

実行結果

angle : 138.225

おわりに

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

1
1
2

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