質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

ハフ変換を用いて角度を調べたい。

tanjiiya
tanjiiya

総合スコア2

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2回答

0評価

0クリップ

473閲覧

投稿2022/01/17 20:11

編集2022/01/19 21:59

斜めに置いた青い物体を上からカメラで撮りながら、画像処理を用いてハフ変換をすることで角度を導きたいのですが、どのように導いたらいいかわかりません。
今現在のプログラムです。↓
// OpenCV includes
#include <iostream>
#include <opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv/cv.h>

using namespace cv;
using namespace std;
#pragma warning(disable:4996)

int main(int argc, char** argv) {
int hr = -1;
try {
//変数の指定
cv::Mat src, edge, dst,img, gray_ocv; /OpenCVの2次元行列型Mat/
std::vectorcv::Vec4i lines; //ベクトル

//画像の読み込み
VideoCapture cap; //カメラキャプチャ
cap.open(CAP_DSHOW);
if (!cap.isOpened()) {
printf("\n\n\n\n*******************************"
"\n* カメラが接続されていない \n"
"
******************************\n\n\n\n\n\n");
return-1;
}
cap >> img;
cvtColor(img, gray_ocv, COLOR_BGR2GRAY); // グレースケールに変換
//img = cv::imread("C:\Users\13KURAN88TU\Downloads\anemone.jpg", cv::IMREAD_GRAYSCALE);//imread関数によって画像をsrcに格納。カラーで読み込むならIMREAD_UNCHANGEDを、グレースケールで読み込むIMREAD_GRAYSCALE
cv::namedWindow("img", 1);//
cv::imshow("img", img);//imgの表示。グレースケールになった後の画像を確認

//輪郭抽出
cv::Canny(img, edge, 50, 200, 3);//2値化する関数

//画像領域確保
dst = cv::Mat::zeros(img.rows, img.cols, CV_8UC3);

//img[0]->dst[2],img[0] -> dst[1], img[0] -> dst[0].コピー元とコピー先を指定
int fromTo[] = { 0,2,0,1,0,0 };

//チャンネル数?を増やしてコピー
cv::mixChannels(&img, 1, &dst, 1, fromTo, 3);

//線分検出
cv::HoughLinesP(
edge, // 8ビット,シングルチャンネル2値入力画像.
lines, //出力先、ベクトル
1, //距離分解能、ピクセル
CV_PI / 180.0, //角度分解能、ラジアン
80, //しきい値。この値を超えている直線が出力される
30, //最小の線分長さ。たぶんピクセル
10 //2点が同一線分上にあると見なす場合に許容される最大距離。ピクセル。
);

//線分描画
for (auto line : lines) {
cv::line(dst, cv::Point(line[0], line[1]), cv::Point(line[2], line[3]), cv::Scalar(0, 0, 255), 1);//線の色と太さを指定(B,G,R,太さ)
}

cv::namedWindow("dst", 1);
cv::imshow("dst", dst);
cv::waitKey(0);
hr = 0;
}
catch (cv::Exception ex) {
std::cout << ex.err << std::endl;
}
//ウインドウの破棄
cv::destroyAllWindows();

return hr;
}

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

tanjiiya

2022/01/18 00:06

ちなみに、Pythonはいれていません。
tanjiiya

2022/01/18 00:40

あと、この物体をベルトコンベアで動かした状態にした場合でも、同じような手順で行うことは可能ですか?
fana

2022/01/18 01:21 編集

質問内容が不明瞭すぎます. 実際のところ何に困っているのか? そもそも何故「ハフ変換で」という話になっているのか? そこらへんの説明はできないのでしょうか? (ハフ変換は「角度」を得たい際の方法としては得策とも思えないのですが.)
tanjiiya

2022/01/18 02:01

すいません、自分の理解もまだまだなため、質問内容も不明瞭になってしまいました。 ハフ変換を用いた理由は、openCVを用いて水平面を水平に動く傾きのある対象物に対して直線を検出したいと考えたからです。 その上で、その線が水平線からどのくらい傾いているかを調べることで角度を出せるのではと考えたからなのですが、プログラムの書き方の手順がどうすればいいのかわからなかったのです。
yominet

2022/01/18 03:05

あなたがすでに作成されているであろうプログラムコードや、対象としている画像を提示してください。 ♯お仕事などであれば、公開できる範囲は気を付ける必要ありますが
tanjiiya

2022/01/18 04:39

今現在のプログラムです。↓ // OpenCV includes #include <iostream> #include <opencv2/opencv.hpp> #include<opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv/cv.h> using namespace cv; using namespace std; #pragma warning(disable:4996) int main(int argc, char** argv) { int hr = -1; try { //変数の指定 cv::Mat src, edge, dst,img, gray_ocv; /*OpenCVの2次元行列型Mat*/ std::vector<cv::Vec4i> lines; //?たぶんベクトル //画像の読み込み VideoCapture cap; //カメラキャプチャ cap.open(CAP_DSHOW); if (!cap.isOpened()) { printf("\n\n\n\n*******************************" "\n* カメラが接続されていない *\n" "*******************************\n\n\n\n\n\n"); return-1; } cap >> img; cvtColor(img, gray_ocv, COLOR_BGR2GRAY); // グレースケールに変換 //img = cv::imread("C:\\Users\\13KURAN88TU\\Downloads\\anemone.jpg", cv::IMREAD_GRAYSCALE);//imread関数によって画像をsrcに格納。カラーで読み込むならIMREAD_UNCHANGEDを、グレースケールで読み込むならIMREAD_GRAYSCALE cv::namedWindow("img", 1);// cv::imshow("img", img);//imgの表示。グレースケールになった後の画像を確認 //輪郭抽出 cv::Canny(img, edge, 50, 200, 3);//2値化する関数 //画像領域確保 dst = cv::Mat::zeros(img.rows, img.cols, CV_8UC3); //img[0]->dst[2],img[0] -> dst[1], img[0] -> dst[0].コピー元とコピー先を指定 int fromTo[] = { 0,2,0,1,0,0 }; //チャンネル数?を増やしてコピー cv::mixChannels(&img, 1, &dst, 1, fromTo, 3); //線分検出 cv::HoughLinesP( edge, // 8ビット,シングルチャンネル2値入力画像.この画像は関数により書き換えられる可能性がある. lines, //出力先、ベクトル 1, //距離分解能、ピクセル CV_PI / 180.0, //角度分解能、ラジアン 80, //しきい値。この値を超えている直線が出力される 30, //最小の線分長さ。たぶんピクセル 10 //2点が同一線分上にあると見なす場合に許容される最大距離。たぶんピクセル。 ); //線分描画 for (auto line : lines) { cv::line(dst, cv::Point(line[0], line[1]), cv::Point(line[2], line[3]), cv::Scalar(0, 0, 255), 1);//線の色と太さを指定(B,G,R,太さ) } cv::namedWindow("dst", 1); cv::imshow("dst", dst); cv::waitKey(0); hr = 0; } catch (cv::Exception ex) { std::cout << ex.err << std::endl; } //ウインドウの破棄 cv::destroyAllWindows(); return hr; }
tanjiiya

2022/01/18 04:41

今現在だと、外部のカメラを取得させることはできているのですが、青色の物に反応させることができていません。
fana

2022/01/18 04:44

(この欄じゃなくて,質問文に追記する形にすると良いかと)
fana

2022/01/18 05:13

既存回答に書かれている単語を用いて 例えば「OpenCV HSV inRange」とかでググれば「特定の色の範囲を狙って抽出する処理」の例を見つけることができるのではないでしょうか.

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。