斜めに置いた青い物体を上からカメラで撮りながら、画像処理を用いてハフ変換をすることで角度を導きたいのですが、どのように導いたらいいかわかりません。
今現在のプログラムです。↓
// 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;
}

回答2件
あなたの回答
tips
プレビュー