質問編集履歴

1

プログラムの追加

2022/01/18 04:54

投稿

tanjiiya
tanjiiya

スコア2

test CHANGED
File without changes
test CHANGED
@@ -1 +1,77 @@
1
1
  斜めに置いた青い物体を上からカメラで撮りながら、画像処理を用いてハフ変換をすることで角度を導きたいのですが、どのように導いたらいいかわかりません。
2
+ 今現在のプログラムです。↓
3
+ // OpenCV includes
4
+ #include <iostream>
5
+ #include <opencv2/opencv.hpp>
6
+ #include<opencv2/core/core.hpp>
7
+ #include <opencv2/highgui/highgui.hpp>
8
+ #include <opencv2/imgproc/imgproc.hpp>
9
+ #include <opencv/cv.h>
10
+
11
+ using namespace cv;
12
+ using namespace std;
13
+ #pragma warning(disable:4996)
14
+
15
+ int main(int argc, char** argv) {
16
+ int hr = -1;
17
+ try {
18
+ //変数の指定
19
+ cv::Mat src, edge, dst,img, gray_ocv; /*OpenCVの2次元行列型Mat*/
20
+ std::vector<cv::Vec4i> lines; //ベクトル
21
+
22
+ //画像の読み込み
23
+ VideoCapture cap; //カメラキャプチャ
24
+ cap.open(CAP_DSHOW);
25
+ if (!cap.isOpened()) {
26
+ printf("\n\n\n\n*******************************"
27
+ "\n* カメラが接続されていない *\n"
28
+ "*******************************\n\n\n\n\n\n");
29
+ return-1;
30
+ }
31
+ cap >> img;
32
+ cvtColor(img, gray_ocv, COLOR_BGR2GRAY); // グレースケールに変換
33
+ //img = cv::imread("C:\\Users\\13KURAN88TU\\Downloads\\anemone.jpg", cv::IMREAD_GRAYSCALE);//imread関数によって画像をsrcに格納。カラーで読み込むならIMREAD_UNCHANGEDを、グレースケールで読み込むIMREAD_GRAYSCALE
34
+ cv::namedWindow("img", 1);//
35
+ cv::imshow("img", img);//imgの表示。グレースケールになった後の画像を確認
36
+
37
+ //輪郭抽出
38
+ cv::Canny(img, edge, 50, 200, 3);//2値化する関数
39
+
40
+ //画像領域確保
41
+ dst = cv::Mat::zeros(img.rows, img.cols, CV_8UC3);
42
+
43
+ //img[0]->dst[2],img[0] -> dst[1], img[0] -> dst[0].コピー元とコピー先を指定
44
+ int fromTo[] = { 0,2,0,1,0,0 };
45
+
46
+ //チャンネル数?を増やしてコピー
47
+ cv::mixChannels(&img, 1, &dst, 1, fromTo, 3);
48
+
49
+ //線分検出
50
+ cv::HoughLinesP(
51
+ edge, // 8ビット,シングルチャンネル2値入力画像.
52
+ lines, //出力先、ベクトル
53
+ 1, //距離分解能、ピクセル
54
+ CV_PI / 180.0, //角度分解能、ラジアン
55
+ 80, //しきい値。この値を超えている直線が出力される
56
+ 30, //最小の線分長さ。たぶんピクセル
57
+ 10 //2点が同一線分上にあると見なす場合に許容される最大距離。ピクセル。
58
+ );
59
+
60
+ //線分描画
61
+ for (auto line : lines) {
62
+ cv::line(dst, cv::Point(line[0], line[1]), cv::Point(line[2], line[3]), cv::Scalar(0, 0, 255), 1);//線の色と太さを指定(B,G,R,太さ)
63
+ }
64
+
65
+ cv::namedWindow("dst", 1);
66
+ cv::imshow("dst", dst);
67
+ cv::waitKey(0);
68
+ hr = 0;
69
+ }
70
+ catch (cv::Exception ex) {
71
+ std::cout << ex.err << std::endl;
72
+ }
73
+ //ウインドウの破棄
74
+ cv::destroyAllWindows();
75
+
76
+ return hr;
77
+ }