ROSのOpenCV_AppsとUSBカメラを使って始める画像処理

##目的
ROSのOpenCV_Appsを使って画像処理を実行する。OpenCV_Appsには、OpenCVの機能を使ったさまざまなノードがあり、その結果をROSトピックとして出力することができる。
OpenCV_Appsを使用すると、OpenCVのコードを書く必要がなくlaunchファイルを実行するだけで、必要なOpenCVの機能に対応する多くの機能を使うことができる。
ROSのlaunchファイルでパラメータを変更できるので、コンパイルせずにパラメータ最適化することも可能である。
ROSのUSBカメラからの画像データに、OpenCV_Appsをつなぐことで、画像処理を行う。

参考：http://wiki.ros.org/opencv_apps

##環境
  Ubuntu-14.04.1(x64)
  ROS:Indigo


##インストール
opencv-appsをapt-getでインストールする。

-ROS Indigoの場合

```
sudo apt-get install ros-indigo-opencv-apps 
sudo apt-get install ros-indigo-usb-cam
```

-ROS Kineticの場合

```
sudo apt-get install ros-kinetic-opencv-apps 
sudo apt-get install ros-kinetic-usb-cam
```


###USBカメラ起動

以下のコマンドでUSBカメラを起動する

```
$ roscore
$ rosrun usb_cam usb_cam_node
$ rosrun image_view image_view image:=/usb_cam/image_raw
```

カメラが起動した後に、個々のlaunchファイルを起動すると、画像処理の結果が表示される。ROSで動作しているので、平行して起動して問題ない。


##エッジ抽出ノード集(Edge Detection Nodes)
###edge_detection
エッジ抽出を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=edge_canny_detection.png" width=320>

```
roslaunch opencv_apps edge_detection.launch image:=/usb_cam/image_raw
```

###hough_lines
[ハフ変換で直線検出](https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=standard_hough_lines.png" width=320>

```
roslaunch opencv_apps hough_lines.launch image:=/usb_cam/image_raw
```

  
###hough_circles
[ハフ変換で円検出](https://docs.opencv.org/2.4/doc/tutorials/imgproc/imgtrans/hough_circle/hough_circle.html)を行うノード

<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=hough_circles.png" width=320>

```
roslaunch opencv_apps hough_circles.launch image:=/usb_cam/image_raw
```


 
##構造解析ノード集(Structual Analysis Nodes)
###find_contours
[輪郭検出](https://docs.opencv.org/2.4/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#findcontours)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=find_contours.png" width=320>

```
roslaunch opencv_apps find_contours.launch image:=/usb_cam/image_raw
```

###convex_hull

[凸包](https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/hull/hull.html)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=convex_hull.png" width=320>

```
roslaunch opencv_apps convex_hull.launch image:=/usb_cam/image_raw
```

###general_contours

[輪郭への楕円あてはめ](https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/bounding_rotated_ellipses/bounding_rotated_ellipses.html)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=general_contours.png" width=320>

```
roslaunch opencv_apps general_contours.launch image:=/usb_cam/image_raw
```


###contour_moments

[輪郭の動き検出](https://docs.opencv.org/2.4/doc/tutorials/imgproc/shapedescriptors/moments/moments.html#moments)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=contour_moments.png" width=320>

```
roslaunch opencv_apps contour_moments.launch image:=/usb_cam/image_raw
```




##人間・顔検出ノード集(People/Face Detection Nodes)
###face_detection

[Cascade分類による顔検出](http://docs.opencv.org/2.4/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=face_detection.png" width=320>

```
roslaunch opencv_apps face_detection.launch image:=/usb_cam/image_raw
```

###face_recognition

[顔認識](http://docs.opencv.org/3.2.0/db/d7c/group__face.html)を行うノード
顔がだれの顔なのか、識別することができる。
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=face_recognition.gif" width=320>

```
roslaunch opencv_apps face_recognition.launch image:=/usb_cam/image_raw
```


###people_detect

[HOG特徴量による人検出](http://docs.opencv.org/2.4/modules/gpu/doc/object_detection.html?highlight=peopledetect)を行うノード

<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=people_detect.png" width=320>

```
roslaunch opencv_apps people_detect.launch image:=/usb_cam/image_raw
```

##動作解析ノード集(Motion Analysis Nodes)
###goodfeature_track
[特徴検出](https://docs.opencv.org/2.4/modules/imgproc/doc/feature_detection.html#goodfeaturestotrack)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=goodfeature_track.png" width=320>

```
roslaunch opencv_apps goodfeature_track.launch image:=/usb_cam/image_raw
```

###camshift
[CamShiftでの色検出](https://docs.opencv.org/2.4/modules/video/doc/motion_analysis_and_object_tracking.html#camshift)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=camshift_result.png" width=320>

```
roslaunch opencv_apps camshift.launch image:=/usb_cam/image_raw
```

###fback_flow
[Gunnar Farneback のオプティカルフロー検出](http://docs.opencv.org/2.4/modules/video/doc/motion_analysis_and_object_tracking.html?highlight=fback#calcopticalflowfarneback)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=fback_flow.png" width=320>

```
roslaunch opencv_apps fback_flow.launch image:=/usb_cam/image_raw
```

###lk_flow
[Lucas-Kanade法のオプティカルフロー検出](http://docs.opencv.org/2.4/modules/video/doc/motion_analysis_and_object_tracking.html?highlight=fback#calcopticalflowfarneback)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=lk_flow.png" width=320>

```
roslaunch opencv_apps lk_flow.launch image:=/usb_cam/image_raw
```


###phase_corr

[周波数領域での位相のコリレーションの計算](https://docs.opencv.org/2.4/modules/imgproc/doc/motion_analysis_and_object_tracking.html#phasecorrelate)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=phase_corr.png" width=320>

```
roslaunch opencv_apps phase_corr.launch image:=/usb_cam/image_raw
```

###simple_flow
[simple_flow のオプティカルフロー検出](https://docs.opencv.org/2.4/modules/video/doc/motion_analysis_and_object_tracking.html#calcopticalflowsf)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=simple_flow.png" width=320>

```
roslaunch opencv_apps simple_flow.launch image:=/usb_cam/image_raw
```

##物体抽出ノード集(Object Segmentaion Nodes)
###segment_objects
[単一物体の領域分割](https://docs.opencv.org/2.4/modules/video/doc/motion_analysis_and_object_tracking.html?#backgroundsubtractormog)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=segment_objects.png" width=320>

```
roslaunch opencv_apps segment_objects.launch image:=/usb_cam/image_raw
```

###watershed_segmentation

[物体の領域分割](http://docs.opencv.org/2.4/modules/imgproc/doc/miscellaneous_transformations.html#watershed)を行うノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=watershed_segmentation.png" width=320>

```
roslaunch opencv_apps watershed_segmentation.launch image:=/usb_cam/image_raw
```


##画像フィルタノード集(Image Filter Nodes）
###rgb_color_filter
RGB色空間でマスクをかけるノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=rgb_color_filter.png" width=320>

```
roslaunch opencv_apps rgb_color_filter.launch image:=/usb_cam/image_raw
```

###hls_color_filter
HLS色空間でマスクをかけるノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=hsl_color_filter.png" width=320>

```
roslaunch opencv_apps hls_color_filter.launch image:=/usb_cam/image_raw
```

###hsv_color_filter
HSV色空間でマスクをかけるノード
<img src="http://wiki.ros.org/opencv_apps?action=AttachFile&do=get&target=hsv_color_filter.png" width=320>

```
roslaunch opencv_apps hsv_color_filter.launch image:=/usb_cam/image_raw
```

##roswikiに未掲載のもの

###corner_harris
harrisのコーナ検出

```
roslaunch opencv_apps corner_harris.launch image:=/usb_cam/image_raw
```

###adding_images
画像の合成

```
roslaunch opencv_apps adding_images.launch image1:=/usb_cam/image_raw image2:=/usb_cam/image_raw
```

###discrete_fourier_transform
FFT変換

```
roslaunch opencv_apps discrete_fourier_transform.launch image:=/usb_cam/image_raw
```

###smoothing
画像にsmoothing処理をいれる

```
roslaunch opencv_apps smoothing.launch image:=/usb_cam/image_raw
```

###threshold
閾値で領域抽出する。

```
roslaunch opencv_apps threshold.launch image:=/usb_cam/image_raw
```