Question by
mahizzta_unity · Dec 07, 2018 at 11:52 AM ·
opencv
If statement, openCV keypoitns and gameobject positions
Hello, I'm making a game where it takes keypoints from the camera and places them ingame, if the position of the keypoint fits the gameobjects where towers will be placed. However, i'm having troubles with getting the if statement for checking the positioning to work.
using OpenCvSharp;
using UnityEngine;
using System.Collections;
using System.Runtime.InteropServices;
using NWH;
using UnityEngine.UI;
using OpenCvSharp.ML;
public class PlaceMonster : MonoBehaviour
{
public ArrayList contours;
public RawImage rawImage;
private WebCamTexture webCamTexture;
private Texture2D tex;
private Mat mat, greyMat;
public GameObject monsterPrefab;
private GameObject monster;
private GameManagerBehavior gameManager;
public GameObject[] openspots;
// Use this for initialization
void Start()
{
openspots = GameObject.FindGameObjectsWithTag("Openspot");
gameManager = GameObject.Find("GameManager").GetComponent<GameManagerBehavior>();
webCamTexture = new WebCamTexture(WebCamTexture.devices[0].name);
webCamTexture.Play();
tex = new Texture2D(webCamTexture.width, webCamTexture.height, TextureFormat.RGBA32, false);
mat = new Mat(webCamTexture.height, webCamTexture.width, MatType.CV_8UC4);
greyMat = new Mat(webCamTexture.height, webCamTexture.width, MatType.CV_8UC1);
}
// Update is called once per frame
void Update()
{
if (webCamTexture.didUpdateThisFrame && webCamTexture.isPlaying)
{
CamUpdate();
}
}
void CamUpdate()
{
CvUtil.GetWebCamMat(webCamTexture, ref mat);
Cv2.CvtColor(mat, greyMat, ColorConversionCodes.RGBA2GRAY);
var thresh = Cv2.Threshold(greyMat, greyMat, 100, 255, ThresholdTypes.Binary);
var detectorParams = new SimpleBlobDetector.Params
{
FilterByArea = true,
MinArea = 20, // 10 pixels squared
MaxArea = 200,
};
var simpleBlobDetector = SimpleBlobDetector.Create(detectorParams);
var keyPoints = simpleBlobDetector.Detect(greyMat);
for (int i = 0; i <= openspots.Length; i++)
{
for (int j = 0; j <= keyPoints.Length; j++)
{
Vector3 open = openspots[i].transform.localPosition;
if (keyPoints[j].Pt = openspots[i].transform.localPosition )
{
//3
monster = (GameObject)Instantiate(monsterPrefab, open, Quaternion.identity);
//4
AudioSource audioSource = gameObject.GetComponent<AudioSource>();
audioSource.PlayOneShot(audioSource.clip);
gameManager.Gold -= monster.GetComponent<MonsterData>().CurrentLevel.cost;
}
}
}
CvConvert.MatToTexture2D(mat, ref tex);
}
private bool CanPlaceMonster()
{
int cost = monsterPrefab.GetComponent<MonsterData>().levels[0].cost;
return monster == null && gameManager.Gold >= cost;
}
//1
/* void OnMouseUp()
{
CvUtil.GetWebCamMat(webCamTexture, ref mat);
Cv2.CvtColor(mat, greyMat, ColorConversionCodes.RGBA2BGR);
var thresh = Cv2.Threshold(greyMat, greyMat, 100, 255, ThresholdTypes.Binary);
var detectorParams = new SimpleBlobDetector.Params
{
FilterByColor = true,
BlobColor = 130,
};
var simpleBlobDetector = SimpleBlobDetector.Create(detectorParams);
var keyPoints = simpleBlobDetector.Detect(greyMat);
CvConvert.MatToTexture2D(mat, ref tex);
rawImage.texture = tex;
if (CanPlaceMonster())
{
//3
monster = (GameObject) Instantiate(monsterPrefab, transform.position, Quaternion.identity);
//4
AudioSource audioSource = gameObject.GetComponent<AudioSource>();
audioSource.PlayOneShot(audioSource.clip);
gameManager.Gold -= monster.GetComponent<MonsterData>().CurrentLevel.cost;
}
}*/
}
I'm also wondering if the game being 26 pixels wide and 15 pixels tall makes it impossible, when the camrea is 720p
Comment
Your answer
