1. 程式人生 > >利用opencv借取相機攝像頭為手機和電腦新增手勢或者體感操控

利用opencv借取相機攝像頭為手機和電腦新增手勢或者體感操控

在展示PPT和產品發發布時,或者看電影時如果能用手勢操作切換會十分方便。這裡使用opencv的開源技術,輕鬆實現這一功能需求。我很久以前曾經寫一個篇被動攝像頭的文章,捕捉到攝像頭中有移動的物體時,開始錄相,移動消失,不再錄相。這樣具有簡單智慧的攝像頭,可以為客戶節省很多的磁碟空間。本文在捕捉運動物體的基礎上實現手勢操作。原文程式碼如下:https://blog.csdn.net/cnbloger/article/details/77513514,在原始碼中,我對捕捉到的動態物體做了一些染色等特效變幻。

本文基於上一文的技術做手勢或者體感識別。前提是我們能夠捕捉到動態物體。有一批執行物體的座標,我們就能根據座標算出物體執行的方向和速度和方向。其實手勢操作也非常簡單,就是座標轉換。以最簡單的手勢手上下左右搖動切換檔案為例。需要把手部的運動轉為向左,向右,向上,向下四個方向的指令。如果準確的獲取方向,我們先通過攝像頭捕捉到手部執行的第一幀影象和最後一幀影象,有兩種演算法都可以計算到方向。

1.用最後一幀手的位置減去第一幀手的位置,螢幕座標是左手座標系,原點在左上角,x軸正方面向右,Y軸正方向向下,如果手向右,得得值必大於0,向左小於0,向上小於0,向下大於0,由於手的移動和捕捉不是精密儀器,必然會有誤差。再比較橫向位移豎向位移大小,可以確定手的方向。

2.第二種方法比較簡單,在螢幕中央設定一個矩形的區域用來做為方向判斷區域,捕捉到手的最後一幀或者所有幀的手的位置,一旦位置的x超出左邊界,手勢向左,一旦超超過右邊界,手勢向右,超過上邊界,手勢向上,超過下邊界,手勢向下。

兩種演算法程式碼如下,1為左,2為右,3為上,4為下,opencv 支援C,C++,python,jAVA和各種系統,使得可以移植在各種平臺,這裡只展示JAVA程式碼:

	public static int getDirect2(Point lastPoint, Point firstPoint) {
		if (firstPoint != null && lastPoint != null) {
			int x = (int) (lastPoint.x - firstPoint.x);
			int y = (int) (lastPoint.y - firstPoint.y);

			if (x > y) {
				if (x > 200) {
					return 1;
				} else if (x < -200) {
					return 2;
				} else {
					return 0;
				}
			} else {
				if (y > 200) {
					return 3;
				} else if (y < -200) {
					return 4;
				} else {
					return 0;
				}
			}
		} else {
			return 0;
		}
	}
	public static int getDirect3(Point point) {

		if ((point.x - left) < -1f) {
			return 1;
		} else if ((point.x - right) > (1f+50)) {
			return 2;
		} else if ((point.y - up) < -1f) {
			return 3;
		} else if ((point.y - down) > (1f+50)) {
			return 4;
		}

		return 0;
	}

執行效果:

b