質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.04%

ARcoreとOpencv for Unity を組み合わせたい

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 678

score 6

実現したいこと

OpenCV for Unityを用いて青色の部分の面積が半分になったことを認識したら、ARcoreを利用してCubeオブジェエクトを出現させたいです。

イメージ説明

今現在できていること

  • ARcoreを利用して3Dオブジェクトを重畳表示
  • OpenCV for Unityを用いて青色部分の認識と青色部分の面積が半分になったことの認識

できていないこと(詰まっているとこ)

今現在できていることで述べた二つの処理を組み合わせることができていません。

青色部分の認識とその面積が半分になったことを認識するスクリプト(OpenCV for Unity)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using OpenCVForUnity;
using OpenCVForUnity.UnityUtils;
using OpenCVForUnity.ImgprocModule;
using OpenCVForUnity.CoreModule;
using UnityEngine.UI;


public class findcontuor : MonoBehaviour
{
    WebCamTexture webCamTexture;



    [SerializeField]
    public GameObject splash;

    [SerializeField]
    public GameObject cube;

    public int Width = 640;
    public int Height = 480;
    public int FPS = 30;



    private readonly static Scalar blue_lower = new Scalar(110, 50, 50);//(H,S,V)??
    private readonly static Scalar blue_upper = new Scalar(130, 255, 255);//(H,S,V)??

    public GameObject text_object = null; // Textオブジェクト



    // もしWebCamでやりたかったらStart()でWebCamを起動します。
    // 画像を読み込む場合は同じくStart()でテクスチャに画像を読み込ませれば以下同じように動きます。
    void Start()
    {

        WebCamDevice[] devices = WebCamTexture.devices;
        webCamTexture = new WebCamTexture(devices[0].name, Width, Height, FPS);
        GetComponent<Renderer>().material.mainTexture = webCamTexture;
        webCamTexture.Play();

    }


    void Update()
    {

        //Matを生成する
        Mat imgMat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC3);

        //Texture→Mat
        Utils.webCamTextureToMat(webCamTexture, imgMat);


        //ガウシアンフィルターによる平滑化
        Mat imgMat2 = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC3);
        Imgproc.GaussianBlur(imgMat, imgMat2, new Size(5, 5), 0);

        // BGRからHSVに変換
        Mat hsvMat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC3);//CV_8UC3??
        Imgproc.cvtColor(imgMat2, hsvMat, Imgproc.COLOR_RGB2HSV);

        //medianBlur化
        Mat blurMat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC3);//CV_8CU3??
        Imgproc.medianBlur(hsvMat, blurMat, 3);

        // 画像の平坦化
        Imgproc.equalizeHist(blurMat, blurMat);


        //2値化
        Mat binMat = new Mat(webCamTexture.height, webCamTexture.width, CvType.CV_8UC3);//CV_8CU3??
        Core.inRange(blurMat, blue_lower, blue_upper, binMat);



        //輪郭を抽出して抽出した輪郭を描く

        List<MatOfPoint> Contours = new List<MatOfPoint>();
        Mat Hierarchy = new Mat();

        Imgproc.findContours(binMat, Contours, Hierarchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);//2値化したMatに対して輪郭を見つける


        // オブジェクトからTextコンポーネントを取得
        Text score_text = text_object.GetComponent<Text>();

        //最大領域を見つける
        int maxIdx = 0;
        double maxArea = 0.0;

        for (int i = 0; i < Contours.Count; i++)
        {
            double tmpArea = Imgproc.contourArea(Contours[i]);
            if (maxArea < tmpArea)
            {
                maxArea = tmpArea;
                maxIdx = i;
            }
        }


        score_text.text = "maxArea:" + maxArea;


        void cut()
        {
            if (maxArea > 3000 && maxArea < 6000)
            {
                Imgproc.putText(imgMat, "Cut!", new Point(5, imgMat.rows() - 70), Imgproc.FONT_HERSHEY_SIMPLEX, 1.0, new Scalar(255, 0, 0, 255), 2, Imgproc.LINE_AA, false);
                //splash = Instantiate(splash, new Vector3(-20, 0, 10), Quaternion.identity);
                //cube = Instantiate(cube, new Vector3(-20,0,50), Quaternion.identity);
            }
        }



        for (int i = 0; i < Contours.Count; i++)
        {
            Imgproc.drawContours(imgMat, Contours, i, new Scalar(255, 0, 0), 2, 8, Hierarchy, 0, new Point());//輪郭を描くのは元のMatに対して描く
        }


        Texture2D texture_out = new Texture2D(imgMat.cols(), imgMat.rows(), TextureFormat.RGBA32, false);//元のMatに輪郭が描かれたものが表示される
        Utils.matToTexture2D(imgMat, texture_out);
        gameObject.GetComponent<Renderer>().material.mainTexture = texture_out;



    }
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.04%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る