質問するログイン新規登録

質問編集履歴

4

編集

2018/05/02 11:50

投稿

carnage0216
carnage0216

スコア194

title CHANGED
File without changes
body CHANGED
@@ -293,4 +293,9 @@
293
293
  }
294
294
 
295
295
 
296
- ```
296
+ ```
297
+
298
+ <編集3>
299
+ 編集2で載せましたコードがなぜ正常に実行できないのかがわかりません。
300
+ depends.exeを利用して必要なDLLは揃えました。
301
+ 基のソースコードがラズパイ用であるためでしょうか?

3

編集

2018/05/02 11:50

投稿

carnage0216
carnage0216

スコア194

title CHANGED
File without changes
body CHANGED
@@ -162,4 +162,135 @@
162
162
  [http://www.kumikomi.net/interface/contents/201401.php](http://www.kumikomi.net/interface/contents/201401.php)
163
163
  載せたソースコードはこの本のサポートページに載っていたものです。
164
164
  どうやら#include <bcm2835.h>が関係しているようです。
165
- ただ、このbcm2835がARMやライブラリにどのように働くかは中身を見てみないとわからないので調べてみます。
165
+ ただ、このbcm2835がARMやライブラリにどのように働くかは中身を見てみないとわからないので調べてみます。
166
+
167
+ <編集2>
168
+ PCの方でもビルドしてみました。
169
+ PCの環境
170
+ - Windows10 64bit
171
+ - OPENCV3.2.0
172
+ - VS2107
173
+ 実行ファイルが得られたのですが、実行すると停止してしまいます。
174
+ 必要なDLLはそろえたのですが実行は出来ませんでした。
175
+ ラズパイでないので少しプログラムを編集しました。
176
+ こちらがプログラムです。
177
+ プログラム自体はラズパイでビルドする予定のものなのでうまくいかなかったのかもしれません。
178
+ (ほかに原因があるように思えますが。)
179
+ ```
180
+ #include <opencv/cv.h>
181
+ #include <opencv/highgui.h>
182
+
183
+ // 未来カメラのメインプログラム
184
+
185
+ int calcBrightness(CvRect* rect, IplImage* frame);
186
+
187
+ int main() {
188
+ int key;
189
+ char str[32];
190
+ int brightness;
191
+
192
+
193
+
194
+ CvCapture *capture = 0;
195
+ IplImage *frame = 0;
196
+
197
+ CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*)cvLoad("/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml");
198
+
199
+ CvMemStorage* cvMStr = cvCreateMemStorage(0);
200
+
201
+ CvSeq* face;
202
+
203
+ CvFont font;
204
+
205
+ // ウィンドウの作成とフルスクリーン表示設定
206
+ cvNamedWindow("capture_window", 0);
207
+ cvSetWindowProperty("capture_window", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
208
+
209
+ // フォント構造体の初期化
210
+ cvInitFont(&font, CV_FONT_HERSHEY_PLAIN, 1, 1);
211
+
212
+ // カメラからのビデオキャプチャを初期化
213
+ capture = cvCreateCameraCapture(0);
214
+
215
+ // 取得するカメラ画像の幅と高さを設定(カメラにより指定できる値が異なります)
216
+ cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH, (double)160);
217
+ cvSetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT, (double)120);
218
+
219
+
220
+ while (1) {
221
+
222
+ // 1フレーム取り出す
223
+ frame = cvQueryFrame(capture);
224
+
225
+ // 画像中から検出対象の情報を取得
226
+ face = cvHaarDetectObjects(frame, cvHCC, cvMStr);
227
+
228
+
229
+ // 検出した個数分のループを回す
230
+ for (int i = 0; i < face->total; i++) {
231
+
232
+ CvRect* faceRect = (CvRect*)cvGetSeqElem(face, i);
233
+
234
+ // 顔検出領域の輝度を取得
235
+ brightness = calcBrightness(faceRect, frame);
236
+ sprintf(str, "B:%d", brightness);
237
+ // 顔の位置に矩形、その下に輝度情報をテキスト表示する
238
+ cvRectangle(frame,
239
+ cvPoint(faceRect->x, faceRect->y),
240
+ cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height),
241
+ CV_RGB(255, 255, 0),
242
+ 2, CV_AA);
243
+ cvPutText(frame, str, cvPoint(faceRect->x, faceRect->y + faceRect->height + 16),
244
+ &font, CV_RGB(255, 255, 0));
245
+
246
+ }
247
+
248
+ cvShowImage("capture_window", frame);
249
+
250
+
251
+ key = cvWaitKey(1);
252
+ if (key == ' ') {
253
+ break;
254
+ }
255
+
256
+ // ダミーでフレームを取得(遅延量を少なく出来るように調整)
257
+ cvQueryFrame(capture);
258
+ cvQueryFrame(capture);
259
+ cvQueryFrame(capture);
260
+ cvQueryFrame(capture);
261
+ }
262
+
263
+ cvReleaseMemStorage(&cvMStr);
264
+ cvReleaseCapture(&capture);
265
+ cvDestroyWindow("capture_window");
266
+ cvReleaseHaarClassifierCascade(&cvHCC);
267
+
268
+ return 0;
269
+ }
270
+
271
+ // 指定した領域の輝度平均値を得る
272
+ int calcBrightness(CvRect* rect, IplImage* frame)
273
+ {
274
+ int x;
275
+ int y;
276
+ unsigned char r, g, b, mono;
277
+ unsigned long sum;
278
+
279
+ sum = 0;
280
+ // rectで指定された領域サイズでループを回す
281
+ for (y = rect->y; y<(rect->y + rect->height); y++) {
282
+ for (x = rect->x; x<(rect->x + rect->width); x++) {
283
+ b = frame->imageData[frame->widthStep*y + x * 3];
284
+ g = frame->imageData[frame->widthStep*y + x * 3 + 1];
285
+ r = frame->imageData[frame->widthStep*y + x * 3 + 2];
286
+ // モノクロのデータを算出
287
+ mono = (unsigned char)((float)r*0.30f + (float)g*0.59f + (float)b*0.11f);
288
+ sum += mono;
289
+ }
290
+ }
291
+ // 平均値を戻す
292
+ return(sum / (rect->width*rect->height));
293
+ }
294
+
295
+
296
+ ```

2

情報不足でした。

2018/05/01 21:19

投稿

carnage0216
carnage0216

スコア194

title CHANGED
File without changes
body CHANGED
@@ -155,4 +155,11 @@
155
155
  <疑問に思ったこと>
156
156
  ラズパイでopencvのライブラリが得られたとして、なぜそのライブラリが正常に動くのでしょうか?
157
157
  ビルドされる前のライブラリのソースコードがどのような出力をするかわからないと思います。その出力されたバイナリデータ(ライブラリ)がラズパイでコンパイルしただけで正常に動く実行ファイルが得られる理由がわかりません。
158
- ラズパイの設計者がgccでopencvのライブラリを使う事を考慮して設計したため実行ファイルが正常に動くのでしょうか?
158
+ ラズパイの設計者がgccでopencvのライブラリを使う事を考慮して設計したため実行ファイルが正常に動くのでしょうか?
159
+
160
+ <編集>
161
+ 今更ですが、この本を参考にしてラズパイでOpencvを使おうと考えていました。
162
+ [http://www.kumikomi.net/interface/contents/201401.php](http://www.kumikomi.net/interface/contents/201401.php)
163
+ 載せたソースコードはこの本のサポートページに載っていたものです。
164
+ どうやら#include <bcm2835.h>が関係しているようです。
165
+ ただ、このbcm2835がARMやライブラリにどのように働くかは中身を見てみないとわからないので調べてみます。

1

編集

2018/04/30 22:09

投稿

carnage0216
carnage0216

スコア194

title CHANGED
File without changes
body CHANGED
@@ -10,59 +10,144 @@
10
10
 
11
11
  こちらがソースコードです。
12
12
  ```
13
- #include <iostream>
14
- #include <sstream>
13
+ #include "cv.h"
14
+ #include "highgui.h"
15
15
 
16
- #include <opencv2/opencv.hpp>
16
+ #define CONTROL_LED
17
17
 
18
+ #ifdef CONTROL_LED
18
- using namespace std;
19
+ #include <bcm2835.h>
20
+ #endif
19
21
 
20
- void doJob() {
22
+ // 未来カメラのメインプログラム
21
23
 
22
- string path = "";
23
- string cascadeName = "haarcascade_frontalface_alt.xml";
24
- string cascadeName2 = "haarcascade_eye.xml";
25
- cv::CascadeClassifier cascade, cascade2;
24
+ int calcBrightness(CvRect* rect,IplImage* frame);
26
- if (!cascade.load(path + cascadeName)) throw runtime_error(cascadeName + " not found");
27
- if (!cascade2.load(path + cascadeName2)) throw runtime_error(cascadeName2 + " not found");
28
25
 
29
- cv::VideoCapture cap(0);
30
- if (!cap.isOpened()) throw runtime_error("VideoCapture open failed");
31
- cv::Mat image;
26
+ int main() {
27
+ int key;
32
- cv::Mat gray;
28
+ char str[32];
33
- while (1) {
34
- cap >> image;
29
+ int brightness;
30
+
31
+ #ifdef CONTROL_LED
35
- cv::cvtColor(image, gray, cv::COLOR_BGR2GRAY);
32
+ // BCM2835ライブラリの初期化
36
- equalizeHist(gray, gray);
33
+ if(!bcm2835_init()){
37
- vector<cv::Rect> founds, founds2;
34
+ printf("bcm2835_init failed\n");
38
- cascade.detectMultiScale(gray, founds, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
39
- for (auto faceRect: founds) {
40
- cv::rectangle(image, faceRect, cv::Scalar(0, 0, 255), 2);
41
- cv::Mat roi = gray(faceRect);
35
+ return(-1);
42
- cascade2.detectMultiScale(roi, founds2, 1.1, 2, 0 | cv::CASCADE_SCALE_IMAGE, cv::Size(30, 30));
43
- for (auto eyeRect: founds2) {
44
- cv::Rect rect(faceRect.x + eyeRect.x, faceRect.y + eyeRect.y, eyeRect.width, eyeRect.height);
45
- cv::rectangle(image, rect, cv::Scalar(0, 255, 0), 2);
46
- }
47
36
  }
37
+ // P1端子11番ピンを出力、LOW設定にする
38
+ bcm2835_gpio_fsel(RPI_V2_GPIO_P1_11,BCM2835_GPIO_FSEL_OUTP);
39
+ bcm2835_gpio_write(RPI_V2_GPIO_P1_11,LOW);
40
+ #endif
41
+
42
+ CvCapture *capture = 0;
43
+ IplImage *frame = 0;
44
+
45
+ CvHaarClassifierCascade* cvHCC = (CvHaarClassifierCascade*)cvLoad("/usr/share/opencv/haarcascades/haarcascade_frontalface_default.xml");
46
+
47
+ CvMemStorage* cvMStr = cvCreateMemStorage(0);
48
+
49
+ CvSeq* face;
50
+
51
+ CvFont font;
52
+
53
+ // ウィンドウの作成とフルスクリーン表示設定
48
- cv::imshow("video", image);
54
+ cvNamedWindow ("capture_window", 0);
55
+ cvSetWindowProperty("capture_window",CV_WND_PROP_FULLSCREEN,CV_WINDOW_FULLSCREEN);
56
+
57
+ // フォント構造体の初期化
58
+ cvInitFont(&font,CV_FONT_HERSHEY_PLAIN,1,1);
59
+
60
+ // カメラからのビデオキャプチャを初期化
49
- auto key = cv::waitKey(1);
61
+ capture = cvCreateCameraCapture (0);
62
+
63
+ // 取得するカメラ画像の幅と高さを設定(カメラにより指定できる値が異なります)
64
+ cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_WIDTH, (double)160);
65
+ cvSetCaptureProperty (capture, CV_CAP_PROP_FRAME_HEIGHT, (double)120);
66
+
67
+
68
+ while (1) {
69
+
70
+ // 1フレーム取り出す
50
- if (key == 'q') break;
71
+ frame = cvQueryFrame (capture);
72
+
73
+ // 画像中から検出対象の情報を取得
74
+ face = cvHaarDetectObjects(frame, cvHCC, cvMStr);
75
+
76
+ #ifdef CONTROL_LED
77
+ // 顔検出数がゼロならLED消灯、それ以外なら点灯の為にGPIOを制御する
78
+ if(face->total == 0){
79
+ bcm2835_gpio_write(RPI_V2_GPIO_P1_11,LOW);
80
+ } else {
81
+ bcm2835_gpio_write(RPI_V2_GPIO_P1_11,HIGH);
51
- }
82
+ }
83
+ #endif
84
+
85
+ // 検出した個数分のループを回す
86
+ for (int i = 0; i < face->total; i++) {
87
+
88
+ CvRect* faceRect = (CvRect*)cvGetSeqElem(face, i);
89
+
90
+ // 顔検出領域の輝度を取得
91
+ brightness = calcBrightness(faceRect,frame);
92
+ sprintf(str,"B:%d",brightness);
93
+ // 顔の位置に矩形、その下に輝度情報をテキスト表示する
94
+ cvRectangle(frame,
95
+ cvPoint(faceRect->x, faceRect->y),
96
+ cvPoint(faceRect->x + faceRect->width, faceRect->y + faceRect->height),
97
+ CV_RGB(255, 255 ,0),
98
+ 2, CV_AA);
99
+ cvPutText(frame,str,cvPoint(faceRect->x, faceRect->y + faceRect->height + 16),
100
+ &font,CV_RGB(255,255,0));
101
+
102
+ }
103
+
104
+ cvShowImage ("capture_window", frame);
105
+
106
+
107
+ key = cvWaitKey (1);
108
+ if (key == ' ') {
109
+ break;
110
+ }
111
+
112
+ // ダミーでフレームを取得(遅延量を少なく出来るように調整)
52
- cv::destroyAllWindows();
113
+ cvQueryFrame (capture);
114
+ cvQueryFrame (capture);
115
+ cvQueryFrame (capture);
116
+ cvQueryFrame (capture);
117
+ }
118
+
119
+ cvReleaseMemStorage(&cvMStr);
120
+ cvReleaseCapture (&capture);
121
+ cvDestroyWindow("capture_window");
122
+ cvReleaseHaarClassifierCascade(&cvHCC);
123
+
124
+ return 0;
53
125
  }
54
126
 
127
+ // 指定した領域の輝度平均値を得る
55
- int main(int argc, char** argv) {
128
+ int calcBrightness(CvRect* rect,IplImage* frame)
129
+ {
56
- try {
130
+ int x;
131
+ int y;
132
+ unsigned char r,g,b,mono;
133
+ unsigned long sum;
134
+
57
- doJob();
135
+ sum = 0;
136
+ // rectで指定された領域サイズでループを回す
137
+ for(y=rect->y;y<(rect->y+rect->height);y++){
138
+ for(x=rect->x;x<(rect->x+rect->width);x++){
139
+ b = frame->imageData[frame->widthStep*y+x*3 ];
140
+ g = frame->imageData[frame->widthStep*y+x*3+1];
141
+ r = frame->imageData[frame->widthStep*y+x*3+2];
142
+ // モノクロのデータを算出
143
+ mono = (unsigned char)((float)r*0.30f + (float)g*0.59f + (float)b*0.11f);
144
+ sum += mono;
58
- }
145
+ }
59
- catch (exception &ex) {
60
- cout << ex.what() << endl;
61
- string s;
62
- cin >> s;
63
- }
146
+ }
64
- return 0;
147
+ // 平均値を戻す
148
+ return(sum / (rect->width*rect->height));
65
149
  }
150
+
66
151
  ```
67
152
 
68
153