エラーメッセージ

```

    mainの戻り値の型にはintを使用してくださいvoidは使用できません。
    int main(void) オーバーロード関数はint main(void)と戻り値の型のみが異なります
    
```

この２つがどうしても消えません  
よろしくお願いいたします

引用元：<http://kivantium.hateblo.jp/entry/20120822/p1>  
Kinect 実践プログラム 杉浦司

```

    #include"stdafx.h"
    #include <time.h>
    #include <stdlib.h>
    #include <iostream>
    #include <sstream>
    #include "opencv/Labeling.h"
    #include <cstdio>
    
    void main()
    {
        try {
            KinectSample kinect;
            kinect.initialize();
            kinect.run();
            using namespace cv;
            using namespace std;
            int num;
            int main(); {
                try {
                    VideoCapture capture(0);
                    Mat RGBMap, Cloud, valid;
                    IplImage ipl_RGB;
                    IplImage *imgR, *imgG = 0, *imgB;
                    IplImage *imgThreshold_R, *imgThreshold_G, *imgThreshold_B, *imgResult, *imgTmp, *RGB_image;
                    int x, y;
                    short *dst;
                    LabelingBS labeling;
                    RegionInfoBS    *ri;
                    dst = new short[640 * 480];
    
                    imgThreshold_R = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
                    imgThreshold_G = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
                    imgThreshold_B = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
                    imgResult = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
                    imgTmp = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1);
                    imgR = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); //Red
                    imgG = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); //Green
                    imgB = cvCreateImage(cvSize(640, 480), IPL_DEPTH_8U, 1); //Blue
                    while (1) {
                        // データの更新を待つ
                        capture.grab();
                        // RGBを取得して表示
                        capture.retrieve(RGBMap, CV_CAP_OPENNI_BGR_IMAGE);
                        ipl_RGB = RGBMap;
                        RGB_image = &ipl_RGB;
                        cvSplit(RGB_image, imgB, imgG, imgR, NULL);
                        // 赤の要素が100以上で、緑と青より1.5倍以上あるピクセルを抽出
                        cvThreshold(imgB, imgThreshold_B, 100, 255, CV_THRESH_BINARY);
                        cvDiv(imgB, imgG, imgTmp, 10); // 10倍
                        cvThreshold(imgTmp, imgThreshold_G, 18, 255, CV_THRESH_BINARY);
                        cvDiv(imgB, imgR, imgTmp, 10);
                        cvThreshold(imgTmp, imgThreshold_R, 18, 255, CV_THRESH_BINARY);
                        cvAnd(imgThreshold_G, imgThreshold_R, imgTmp, NULL);
                        cvAnd(imgTmp, imgThreshold_B, imgResult, NULL);
                        cvAnd(imgThreshold_G, imgThreshold_R, imgTmp, NULL);
                        cvAnd(imgTmp, imgThreshold_B, imgResult, NULL);
    
                        //ラベリング
                        labeling.Exec((uchar *)imgResult->imageData, dst, imgResult->width, imgResult->height, true, 30);
                        if (labeling.GetNumOfResultRegions() != 0) {
                            ri = labeling.GetResultRegionInfo(0);
                            //四角形の描画
                            int ltop_x, ltop_y, rbottom_x, rbottom_y;
                            ri->GetMin(ltop_x, ltop_y);
                            ri->GetMax(rbottom_x, rbottom_y);
                            cvLine(RGB_image, cvPoint(ltop_x, ltop_y), cvPoint(rbottom_x, ltop_y), CV_RGB(255, 255, 255));
                            cvLine(RGB_image, cvPoint(rbottom_x, ltop_y), cvPoint(rbottom_x, rbottom_y), CV_RGB(255, 255, 255));
                            cvLine(RGB_image, cvPoint(rbottom_x, rbottom_y), cvPoint(ltop_x, rbottom_y), CV_RGB(255, 255, 255));
                            cvLine(RGB_image, cvPoint(ltop_x, rbottom_y), cvPoint(ltop_x, ltop_y), CV_RGB(255, 255, 255));
                            float f_x, f_y;
                            ri->GetCenter(f_x, f_y);
                            x = (int)f_x;
                            y = (int)f_y;
                            capture.retrieve(Cloud, CV_CAP_OPENNI_POINT_CLOUD_MAP);
                            capture.retrieve(valid, CV_CAP_OPENNI_VALID_DEPTH_MASK);
                            if (valid.at<unsigned char>(y, x) == 0xff) {
                                Vec3f s = Cloud.at<Vec3f>(y, x);
                                printf("%f %f %f\n", s[0], s[1], s[2]);  //座標を表示
                            }
                            else {
                                printf("invalid!\n");
                            }
                        }
    
                        cvShowImage("Window", RGB_image);
                        if (waitKey(10) >= 0) {
                            break;
                        }
                    }
                    destroyAllWindows();
                }
                catch (...) {
                    cout << "exception!!" << endl;
                }
            }
        }
    
        catch (std::exception& ex) {
            std::cout << ex.what() << std::endl;
        }
    }
    
```
CC BY-SA 4.0
2018-10-10T07:35:21.270
49131
2018-12-19T18:15:02.637
2018-12-19T18:15:02.637
30446
30446
question
opencv kinect
kinectで青玉の認識をopencvを使って行いたいです
main関数の書き方が間違っています。

まずmain関数を

```

    void main()
    {
      try {
        KinectSample kinect;
        kinect.initialize();
        kinect.run();
      }
      catch (std::exception& ex) {
        std::cout << ex.what() << std::endl;
      }
    }
    
```

のように書き換えてください。

青玉を認識するコードを`run()`関数の中に記述します。処理の流れは

  * 入力画像をHSV形式に変換する
  * 画像の青い部分を抽出する
  * 抽出した画像の連結成分を取り出す

という感じです。連結成分を取り出す際にはOpenCVの`connectedComponentsWithStats()`関数（[ドキュメント](https://docs.opencv.org/3.0-beta/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html#connectedcomponents)）を使うことをおすすめします。この関数はOpenCV
3.0以降でしか使えないので必要であれば新しいバージョンのOpenCVをインストールしてください。

青玉の認識を行う`run()`関数の例を示します。

```

    void run()
    {
      cv::Mat image;
    
      //メインループ
      while (1) {
    
        //データの更新を待つ
        DWORD ret = ::WaitForSingleObject(streamEvent, INFINITE);
        ::ResetEvent(streamEvent);
    
        drawRgbImage(image);
    
        cv::Mat h_image;
        cv::flip(image, h_image, 1);
    
        // RGB画像をHSV画像に変換
        cv::Mat hsv, extracted;
        cv::cvtColor(h_image, hsv, CV_RGB2HSV); // カメラ画像がBGRの場合はCV_BGR2HSV
        // 色が100<=H<=120, 80<=S<=255, 80<=V<=255の範囲の部分を抽出する
        // 色の範囲は抽出したい物体の色に合わせて調整する
        cv::Scalar hsv_min = cv::Scalar(100, 80, 80);
        cv::Scalar hsv_max = cv::Scalar(120, 255, 255);
        cv::inRange(hsv, hsv_min, hsv_max, extracted);
    
        // ラベリング実行
        cv::Mat labelImg, stats, centroids;
        int nLabels = cv::connectedComponentsWithStats(extracted, labelImg, stats, centroids);
    
        // 長方形の描画
        for (int i = 1; i < nLabels; ++i) {
          int *param = stats.ptr<int>(i);
    
          int x = param[0];
          int y = param[1];
          int width = param[2];
          int height = param[3];
    
          /* C++11の場合はこう書いたほうが分かりやすい
             int x = param[cv::ConnectedComponentsTypes::CC_STAT_LEFT];
             int y = param[cv::ConnectedComponentsTypes::CC_STAT_TOP];
             int width = param[cv::ConnectedComponentsTypes::CC_STAT_WIDTH];
             int height = param[cv::ConnectedComponentsTypes::CC_STAT_HEIGHT];
           */
    
          cv::rectangle(h_image, cv::Rect(x, y, width, height), cv::Scalar(255, 255, 255), 2);
        }
    
        //画像を表示する
        cv::imshow("kinect Sample", h_image);
    
        //終了のためのキー入力チェック兼、表示のためのウェイト
        int key = cv::waitKey(10);
        if (key == 'q') {
          break;
        }
      }
    }
    
```

青色の範囲は自分で調整してみてください。

参考

  * [OpenCVによる特定色画素の抽出(RGB vs HSV)](http://tecsingularity.com/opencv/colorextraction/)
  * [使っている人いるのかな？OpenCV3.0から入ったラべリング処理について](https://qiita.com/wakaba130/items/9d921b8b3eb812e4f197)
CC BY-SA 4.0
2018-10-10T10:10:55.997
49139
2018-10-11T05:27:07.060
2018-10-11T05:27:07.060
27084
27084
49131
answer