質問編集履歴
1
プログラムの追加
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
|
+
}
|