Raspberry PI3 でソニーセミコンダクタソリューションズのIU233をOpenCV経由で動かす②　IU233をUSB接続で画像出し（Mac上）

# 概要
今年の[みんなのラズパイコンテスト2017](http://coin.nikkeibp.co.jp/coin/itpro-s/seminar/LIN/abstract/index.html)で，ソニーセミコンダクタソリューションズさんの「[IU233](http://www.sony-semicon.co.jp/products_ja/IS/sensor3/index.html)」をお借りすることができました．
IU233をラズパイで動かす手順については，「[ビジョンプロセッシング・コミュニティ](https://www.visionproc.org/IU233_usage.php)」にて説明がなされているのですが，これを実際にプログラムに組み込んで使用するためにOpenCV上からアクセスすることを目指してトライしてみました．
前回の記事は[こちら](http://qiita.com/Yakatano/items/4dc6b110c2da99e15f9a)

# 前回の反省
前回の記事では、CSIに挿さっているのでついついraspicam_cv を入れてしまいましたが、いろいろ動かしてもやっぱりダメでした。

基本的には「[ビジョンプロセッシング・コミュニティ](https://www.visionproc.org/IU233_usage.php)」に書かれているようにVisionProcessingFramework(VPF)を使うのが一般的？　のようです。

ただ、これだと電源入れて即使えるようにするのは難しそうだし、他のセンサとも連動させたりしたいので、できれば使いたくない。
そこで[IU233 コミュニティ](https://www.visionproc.org/community_thread.php?category=8)をチェックしたところ、[IU233+USB基板+Raspbianで画出し](https://www.visionproc.org/community_article.php?category=8&article=37)にこんな見出しが。。
USBならOpenCVでもPythonでも操作可能なので、まずはmacbookでこの方法の動作を確認。

※ USBカメラでの動作検証なので、以後の作業はMacbook Proにて行なっています。


# opencvによる画像出力
まずは[フォーラムのページ](https://www.visionproc.org/community_article.php?category=8&article=37)から、同様のOpenCVプログラムを作成して、コンパイル＆実行。。


# opencv & Python での実行
```py3
import cv2

cam = １
camera = cv2.VideoCapture(cam)

while(camera.isOpened() == True):
    ret, frame = camera.read()
    cv2.imshow('image', frame)
    
    c = cv2.waitKey(1) & 0xFF
    if c == 27:
        break
```
上のプログラムを作成してチェック。（macbookには内臓のカメラがあるので、カメラ番号は１）
<img width="1392" alt="スクリーンショット 2017-08-08 14.38.30.png" src="https://qiita-image-store.s3.amazonaws.com/0/47773/aa16aeaf-93ec-5839-7479-145e00f4e441.png">

絵は出ました。

## 解像度、FPSの変更
### python版
[ここ](https://www.visionproc.org/community_article.php?category=8&article=37)には、
> cvSetCaptureProperty 関数を使うとサイズを指定できるようです。 

とあるので、

```
camera.set(cv2.CAP_PROP_FPS, 60)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 400)

print(camera.get(cv2.CAP_PROP_FPS))
print(camera.get(cv2.CAP_PROP_FRAME_WIDTH))
print(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))
```

こうすると、cv2.CAP_PROP_FRAME_WIDTHとcv2.CAP_PROP_FRAME_HEIGHTの値は（1280、720）とフルサイズで表示され、cv2.CAP_PROP_FPSの値は0.0となり、変更することができません。

python 上でやったから変更できないのかな？
Cでやったらできるか検証。。

### C++版
CPPでもやってみました。

```
#include <iostream>
#include <opencv2/opencv.hpp>

int main(int argc, const char * argv[]) {
    // insert code here...
    
    cv::VideoCapture cap(1);

    int width = 640, height = 400;
    cap.set(CV_CAP_PROP_FRAME_WIDTH, width);
    cap.set(CV_CAP_PROP_FRAME_WIDTH, height);
    
    if(!cap.isOpened())
    {
        return -1;
    }
    
    for(;;)
    {
        cv::Mat frame;
        cap >> frame;
        cv::imshow("frame", frame);
        if(cv::waitKey(30) == 'q')  break;
    }
    
    std::cout << "Hello, World!\n";
    return 0;
}
```
ところがこれだとうまくいかない。。。
[ここ](https://www.visionproc.org/community_article.php?category=8&article=37)にあるように、cv::Matではなく、IplImageでやるとうまくいくのに。。。

ｃｐｐ版では画像サイズが変更できない。Pythonでもうまくいかないのは根が同じように思える。
今更IplImageでやるのもイヤだなあ。



やっぱりUSBモードでは無理なのかな。今度はlibSSPでやってみよう


「[Raspberry PI3 でソニーセミコンダクタソリューションズのIU233をSSP+OpenCV経由で動かす③　IU233をCSIから撮影](http://qiita.com/Yakatano/items/da5812c137ac470d462e)」に続く．