2017年8月24日

NodeMCU與Blynk製作物聯網天氣站

上回製作天氣站(以arduino製作的雲端天氣站),才三年前的事情,不過製作的難度和呈現界面 卻因為科技而大大改變了。

當時把感測器和Arduino結合之後,為了達到資料儲存與呈現,我得把資料送到pushing box這個網站,再請pushing box把資料推送到Google表單,所以pushing box就像是個機器人一樣,每隔幾秒收到資料後就去填寫Google表單。

而如果我要取得過去幾個月的氣溫資料圖表,我還很難從Google試算表中撈出來,因為資料量太大了。我是下載後,再用程式打撈出來繪圖(gnuplot繪製室內氣溫與氣壓對照圖)

才過沒多久,這些繁雜的程序已經簡化到非常簡單了。就以我這篇介紹的Blynk為例吧,這個服務它同時可以作到接收資料、儲存資料、呈現資料(用App),然後一切動作熟悉的話就是半個小時內搞定。




2017年8月21日

霜毛蝙蝠觀察與蝙蝠屋製作

8/5-8/6參加了一場活動「看見傳說中的霜毛蝠」



新竹有霜毛蝠的新聞,最早是在2010年出現在媒體
霜毛蝠60年罕見! 新竹煙囪一窩500隻

不過那時候我沒有特地去看個究竟,直到七年後這個活動才算真的認識這種生物。

根據這篇研究報告《新竹地區霜毛蝠的族群生態與食性研究》,霜毛蝠其實幾十年前就被發現了,不過當時只有屍體,後續都只有發現很少數量,直到2010年才發現一個幾百隻的族群,而且就在市區的廢墟中。
http://conservation.forest.gov.tw/File.aspx?fno=63157


霜毛蝠在臺灣的首筆紀錄是由美國學者 David H. Johnson 於 1952 年採自台中縣東勢馬鞍寮的一隻死亡的雄性霜毛蝠個體,之後超過半個世紀的歲月,在國內皆未有任何的捕獲或發現記錄。直到超過半個世紀後的 2006 年始由東海大學林良恭教授研究團隊於雪霸國家公園內的觀霧地區(海拔約 1,900m),捕獲一隻雌性成體霜毛蝠(陳家鴻等 2007),而在 2010 年才發現首次出現的群集,也是本計畫觀察研究的對象。
2010 年 7 月,於新竹市內一處屬於二次世界大戰遺址的廢棄煙囪內部發現一群蝙蝠群棲息於夾縫處。經臺灣蝙蝠學會與東海大學林良恭教授的捕捉鑑定,確認為罕見的霜毛蝠,該處經估算約有 600-700 隻聚集而成的群集,本次發現為國內第一次發現霜毛蝠棲所的紀錄,而且該處霜毛蝠重要的生殖育幼棲所。這一次的發現與先前發現記錄不同的是,本次是在平地都會區的人工建築物中發現,而且是霜毛蝠的生殖群集。




當天的講座有特生中心的鄭錫奇老師,他特別帶來了一隻受傷正在人工飼養的霜毛蝠,讓大家有機會近距離看看牠的樣子。顧名思義,是一種身上有霜白毛髮的蝙蝠。
DSC01267


DSC01263



DSC01266


當天除了介紹之外,在傍晚也特地帶大家進入大煙囪以及走到附近社區去看霜毛蝠。今年進入大煙囪棲息的數量已經變少了,雖然附近社區也是有幾百隻的數量,但是並不能直接確認就是蝙蝠不住大煙囪改住社區了,也有可能是一直以來都有一群都住社區,而住煙囪的變少了。

說牠們住煙囪,其實也只是短暫居住幾個月而已。來這裡棲息的個體大多數都是雌性個體,而且是來這邊生小孩的,換句話說這裡有點像是坐月子中心。等到八九月之後,這些蝙蝠又會離開這邊,至於去哪裡?是去台灣的高山還是飛往其他國家,目前都沒有答案。

這段影片中是鄭組長帶來的小蝙蝠活動情形,32秒之後就是傍晚去社區看蝙蝠,我看到牠們從樓頂的鐵皮屋縫隙飛出的樣子(影片有經過剪接,所以不是立刻好幾隻接連飛出)

 





這個就是大煙囪,當天棲息在內的蝙蝠數量僅有數十隻,而不是數年前觀察到的5
、600隻。

DSC01270




隔天的課程是製作蝙蝠屋,由黃金蝙蝠生態館館長張恒嘉教導,讓大家將一片片已經切割好的木板組裝成一個蝙蝠願意住進去的小屋子






最後大家再進行彩繪



根據一些研究,蝙蝠屋的架設位置會影響蝙蝠的入住意願

較受蝙蝠喜愛的架設位置如下
位於年輕且缺乏樹洞的林分
製於棲所附近
懸掛高度超過4m
面向東、南方
前方較無遮蔽
較少人為干擾
離水源、建築物或樹林距離較近






2017年8月18日

使用imagej的ROI Manager分析肌肉比例

這個案例是針對肌少症(sarcopenia)的肌肉量分析,需要計算在脊柱旁肌群(paraspinal muscles )中的實質肌肉量有多少,但需要排除在肌群內的脂肪量才能計算

運用方式就跟之前協助指導的一些案例相同,請見「imagej分析影像面積-活用ROI Manager

過程中會用到ROI Manager的AND和XOR運算



圖片來源:Imagej的說明文件
(用瀏覽器的搜尋功能進入此頁後,找"ROI Manager"就可以找到那一段落)

詳細的作法說明如影片所示




2017年8月14日

用定點攝影加上OpenCV看英仙座流星雨


2017英仙座流星雨疊圖

2017/8/12晚上有英仙座流星雨,不過我當天晚上沒看。隔天看資料的時候,看到它的輻射點似乎和我定點攝影拍的方位一致,心想自己持續架在窗邊的定點攝影機是不是有拍到。昨天就檢視那些影片,果然看到了一些流星還有火流星呢。

不過自己用眼睛看啊看,實在是很累的事情。因為是快轉看的,甚至還會因此而錯失某些路徑短的流星。所以就想應該來寫一個python script來自動搜夜空的流星才是。

分析流程如下:
1.把夜空畫面切出來轉成灰階
2.偵測畫面的灰階值是否有大於某個閾值,如果有代表天空有亮點
3.把偵測到亮點的畫面資料存出來,包括亮點的灰階值、位置、檔案名稱(代表時間),還有把具有亮點的影格也存出來。


最後用眼睛確認那個亮點到底是飛機還是流星,其實這個用程式也能判斷,就是看亮點的移動速度就可以。過程中還發生一個插曲,我的程式分析的影片到凌晨三點多就開始偵測到持續的亮點,以至於資料量爆增,事後去看,原來是那個時間點月亮出來了。


最後我再把影格用imagej處理,匯出影片還有疊圖。影片濃縮了七八個小時的流星片段,要許願就看這片就行了。疊圖(最上面的圖片)則是可以看出輻射點的位置,就在畫面上方。



 我想未來可以做一個「流星自動許願機」,就只要在程式裡輸入願望,然後把攝影機對準夜空,就可以去睡覺了,不用熬夜看流星。機器偵測到流星之後,就會自動語音播報願望,保證不會錯失流星,這樣真是太偉大了。 

以下就是流星雨的出現資料,打星號為明顯而持續的流星,可能是火流星。
2017/08/12 19:10:37
2017/08/12 20:28:52
2017/08/12 21:30:14
2017/08/12 21:38:19
2017/08/12 21:59:43
2017/08/12 22:06:33 *
2017/08/12 22:37:14
2017/08/12 23:08:32
2017/08/12 23:09:11
2017/08/13 00:12:54
2017/08/13 00:44:56 *
2017/08/13 01:05:42
2017/08/13 01:09:20 *
2017/08/13 01:34:5
2017/08/13 01:39:34
2017/08/13 01:40:24
2017/08/13 01:50:19
2017/08/13 01:50:40
2017/08/13 01:54:35
2017/08/13 02:35:11
2017/08/13 02:38:31 *
2017/08/13 02:46:35
2017/08/13 03:05:29
2017/08/13 03:10:16
2017/08/13 03:12:36










****以下為程式的部份***************************************
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import numpy as np
import cv2
import os
import math
from collections import deque
from operator import itemgetter


def meterFinding(file,video_index):

    frameNum = 0
    cap = cv2.VideoCapture(file)

    #開始處理影格
    while(cap.isOpened()):
        #現在處理到哪個檔案
        print(videofiles[video_index])
        ret, frame = cap.read()


        #獲知每秒多少影格frame per second
        fps = cap.get(cv2.CAP_PROP_FPS)
       
        #影格播完了,就播放下一個,直到video_index到達影片檔案的數量,就停止
        if frame is None:

            video_index += 1
            if video_index >= len(videofiles):
                break
            cap = cv2.VideoCapture(videofiles[ video_index ])
            ret, frame = cap.read()
            frameNum=0
        #把天空從影格中裁切出來[y1:y2,x1,x2]
        sky=frame[0:202,271:1270]

        #天空轉換成灰階
        gray_sky = cv2.cvtColor(sky, cv2.COLOR_BGR2GRAY)



        #找黑天空上的最大灰階值
        max_value = max(max(l) for l in gray_sky)
        #print(max_value)





        #如果最大灰階值大於120,代表有流星,就把檔案路徑印出
        if max_value >120:
            print(videofiles[video_index])

            with open("output.txt", "a") as text_file:

                #輸出檔案名稱
                text_file.write(videofiles[video_index])
                text_file.write("\t")

                #輸出秒數
                text_file.write(str(int(frameNum/fps)))
                text_file.write("\t")

                #輸出最大值
                text_file.write(str(max_value))
                text_file.write("\t")

                #輸出流星的位置
                ar = np.array(gray_sky)
                max_index = np.where(ar == max_value)



                #y的位置
                text_file.write(str(max_index[0]))

                text_file.write("\t")

                #X的位置(越大,越靠右,500多在山邊,900多就是在山上)
                text_file.write(str(max_index[1]))



                text_file.write("\n")


                #把畫面存起來

                pngName = videofiles[video_index]
                pngName = pngName.lstrip("/home/pancala/Desktop/video/test/")
                pngName = pngName.rstrip(".mp4")
                pngName = pngName.replace('/', '')
                pngName = pngName + "_" + str(int(frameNum/fps)) + "_" + str(frameNum)
                pngName = pngName + ".png"
               
                cv2.imwrite(pngName,frame)

        #if max(gray_sky,key=itemgetter(1))[0] >30:
            #print(max(gray_sky,key=itemgetter(1))[0])

        #呈現夜空
        #cv2.imshow('sky',gray_sky)

        frameNum = frameNum +1
        #調整waitkey 控制播放速度
        k = cv2.waitKey(5) & 0xff
        if k == 27:
            break



    cap.release()
    cv2.destroyAllWindows()


video_index = 0
videofiles = []
for dirPath, dirNames, fileNames in sorted(os.walk("/home/pancala/Desktop/video/test")):
    for f in sorted(fileNames):
        inputFile=os.path.join(dirPath, f)
        lastFile=os.path.splitext(f)[-1]
        if lastFile==".mp4":
            #file='output.mp4'
            #把檔案路徑都放進videofiles的list
            videofiles.append(inputFile)

#videofiles = [n for n in os.listdir('.') if n[0]=='c' and n[-4:]=='.mp4']
#videofiles = sorted(videofiles, key=lambda item: int( item.partition('.')[0][3:]))

meterFinding(videofiles[0],video_index)

2017年8月12日

Moodle帶著隨身走-魔豆盒(moodleBox)

想像一些情境,帶學生在校園活動,需要用到行動學習的教學平台,但是根本就沒有網路訊號?或是在無法建置網路的學校或教室,想要有行動學習的平台,那該怎麼做?或是像我一個同事的需求,想要讓學生用Moodle做測驗,但是不希望學生連到網際網路。

這要怎麼做到呢?簡單,一塊樹莓派就可以辦到,讓Moodle平台帶著隨身走耶!











昨天前往新竹縣網中心學到了這個東西,叫做魔豆盒(MoodleBox),是把Moodle架在樹莓派3上,可以同時提供wifi熱點和moodle平台。由於moodle平台是直接架在樹莓派上,所以不需要網際網路也可以,而如果真的需要連線,也只要用網路線接上樹莓派就可以。

安裝很難嗎?超簡單的,不用管什麼網路設定、伺服器設定的。你所要做的就是買一塊讀寫速度快的記憶卡,把moodleBox的的img映像檔燒錄進去,插上電源後,一切就自動搞定了,剩下就是老師建課程了。
有興趣建制的,可以看看我的建置筆記
https://docs.google.com/document/d/1q3REWSHKbuhhoR4jXm0y14Qiq55_lS1jXi6Gynv0nDA/edit


德文老師和士玉老師也寫了建置的筆記
https://docs.google.com/document/d/1VcD3TFByOcfoKzqycGLcHm0yTg3VuhC40DQB8RVEN6Y/mobilebasic



想起以前出去演講行動學習的時候,有老師問起moodle,也想要擁有一個,但是苦於學校沒站,或是網路環境受限,我想這魔豆盒就是一個很棒的解決方案。

而如果想要架在網際網路上,現在也可以直接到教育雲的「合作備課」平台,申請開課。你就不用考慮架站或是站台管理的問題,學生也可以用Google帳號或是使用教育雲的單一帳號登入你的Moodle課程。

用GoogleEarth Engine看台灣的滄海蒼田變化

最近看公視在播高公局的紀錄片「重返里山」(可以在youtube看到喔),片中幾個點還蠻熟悉的,像那個跨越高速公路的大橋就是兩年前特地去看的西湖段大跨距拱橋,然後中二高苗栗通霄段也是常常會經過的地方。

道路開發帶來的是棲地的切割,高速公路就像一道城牆在土地上畫出界線,兩側的動物交流變成十分困難,這是開在高速公路上的我們很難想像的一件事。

在高速公路還沒建成前,這裡長什麼模樣,動物怎麼樣在這塊土地上自由來回穿梭?這是我在車上經常的疑問。

在Google Earth Engine的網站(https://earthengine.google.com/timelapse/)上有一個Timelapse功能,蒐集了1984年以來32年的影像資料,可以讓我們看到這些年來大地的改變。

我把畫面移動到苗栗通霄的位置,畫面中出現的兩條線, 一個是二高,另一個是高鐵。二高各段的建成時間不相同,北二高是1993-1997,中二高是1998左右,高鐵則是2007。




我把畫面再往南移動,到了外傘頂洲,看到的是外傘頂洲越來越小,看起來現在已經比五年前我去的時候小更多了。




還有哪些地方可以看看呢?

  • 基隆河可以看到截彎取直那段,現在是摩天輪
  • 新莊五股二重疏洪道那一帶,1984年還可以看到一大片溼地
  • 屏東那的山區,在2002-2003年開始,就山上大禿
  • 萬大水庫在最近幾年,北面的淤塞都沒消失

另外,最前面提到的重返里山紀錄片
有興趣多了解的,這個blog有介紹

田鱉埤塘谷津田
http://giantwaterbug.blogspot.tw/

這塊田的地點,可以用GoogleMap搜尋:24.518813, 120.724761

LASS年會與Hack4U Live 空氣盒子工作坊

上個月底(7/29)第二屆LASS年會在交大舉辦,因為地利之便就報名參加了。

LASS是Location Aware Sensing System的簡寫,公民透過開源軟體、硬體、韌體進行在地環境感測,並將這些環境資料整合在一起成為環境感測的網路,目前最主要進行的就是空污指標之一的 pm 2.5的感測。

當天的演講投影片都在此連結

其中最讓我眼睛一亮的是這個專案超酷的-「紫豹在哪裡?」



作者將各個測站的的歷史資料、風向...等整合在一起做視覺化呈現,可以用在追蹤空汙的動向,甚至可以推測汙染是境外移入還是境內產生。

以下這個連結是作者的簡報,也都能連結到各個案例的視覺化呈現的頁面https://docs.google.com/presentation/d/17d_l0R2q03712SDd8CCWDOqNF7-2oJBlvWoYvV8a-U8/edit#slide=id.g23cdeac48e_0_400


下午的課程中有一個是「HACK4U」空污監測設備的自作課程,製作的成品如下


可以偵測 pm2.5濃度、溫度、濕度,並將這些資訊傳到LASS和Blynk的伺服器。傳到LASS的伺服器之後,可以在gov零時空污觀測網看到你提供的資料。而傳到Blynk的部份,則是可以結合手機APP看到連續性的歷史資料。


設計者的巧思讓這個Hack4U也能夠進行移動偵測,只要讓Hack4U連上手機熱點,然後你可以帶著裝置四處移動,它會自動抓取手機的GPS位置還有所在地的環境資料。隨後你可以用Blynk的APP把這些感測資料下載成csv檔,再做後續分析。


Hack4U的硬體主要是RealtekAmeba 8195開發版,溫濕度感測器是SHT31,pm2.5感測器則是PlenTower PMS3003 (G3) 。有興趣取得的話,在iCshop可以購得套件,但是組裝和程式安裝要自己來。另外,Hack4U的臉書社團是這個「Hack 4Ü : Arduino生活改造計劃」,有相關的文件如此連結

其實除了這個以外,去年我還做了一些其他的空氣監測的專案,像是「使用Arduino動手監測空氣懸浮微粒」、「迷你空氣盒子」,還有一個是沒寫出來是LASS Field Try的套件(安裝的說明文件可以看這個這個



空拍機製作正射投影地圖(1)簡介

會對這個主題感到興趣是因為看到這個工作坊的訊息-《2017 北部NGO 無人載具航拍製圖工作坊


以下引述工作坊的說明
近年來,操作無人載具和影像處理的技術門檻及成本已大幅降低,使得無人載具已逐漸普遍應用在新聞媒體攝影、測量製圖、土地與工程開發、環境監測、生態保育各領域。目前,大家對於無人載具的攝影或錄影功能已相當熟悉,但對於如何搭配相關軟體,採用航空攝影測量技術產生3D模型動畫、正射影像、地表模型等影像資料,再進一步使用地理資訊系統分析這些資料、製作地圖或追蹤環境變遷的功能較為陌生。過往,大家需要花費很多時間和精力來收集國內各種環境議題相關的現場資料,做為對抗各種不當開發的直接證據;若能普遍的運用無人載具航空攝影測量和地理資訊系統的技術來監測關注區域的環境(或地景)變遷,對於環境變遷資訊的累積、傳播及環境運動應該會有很大的幫助。


我對於環境監測一直有很大的興趣,很多年以前看到public lab有個氣球空拍計畫,那時就一直躍躍欲試,當時連氣球都買了,但是卡在還要去買氦氣,三分鐘熱度就過了,所以還沒真的去做。對於氣球空拍有興趣的,以下幾個連結可以去看看。




對於環境監測來說,可以用氣球空拍,不過如果想要進行更精密的測量與監測,空拍機當然會比較好。我看了最上面的工作坊連結裡頭的製圖的講義之後,在取得空拍機後便想自己嘗試看看。不想拿空拍機只是飛高高拍照片影片而已,而是希望飛高高之後,可以在公民科學等方面做些事情,像是觀察樹冠覆蓋率、開發監測、環境變遷、天災、3D建模等。



使用空拍機進行製作正射投影地圖的流程如下
(1)規劃航線,以電腦輔助拍攝
(2)使用軟體將影像拼接成正射投影的影像、點雲、立體模型檔(obj、ply...)
(3)展示、分析與研究

幾個網站都已經將這個流程包裹成完整的App與雲端網站服務,使用者只要在App的地圖上規劃好拍攝的區域,App可以自動根據設定的高度和面積以及照片覆蓋率規劃好拍攝路線以及拍攝時機,當連接空拍機後,App可以自己控制拍照。使用者只要等空拍機拍攝完,拿出記憶卡用電腦上傳到網站,按幾個鍵等幾個小時之後,就可以在網站上瀏覽自建的正射投影地圖,甚至也可以產生3D建模的模型(處理後可以做3D列印)。不過服務這麼好的前提就是要收費!不過在某些情況下甚至是可以免費使用的,但就是功能受限。我研究了幾個網站和軟體,把它們做了些比較


一開始本想來拍拍學校,用來建模,不過後來查了禁航的資料,本校不偏不倚剛好門口開始就是被劃入機場內的禁航區,所以連飛都不可以飛,因此我就找了頭前溪來拍攝了。


空拍機常見之禁航區地圖 on Google Map 台灣禁限航區

********************************************************************

Pix4D:這是工作坊的講義中使用的軟體,我沒有實際使用過。有對應的航線規劃APP,還有雲端儲存與展示結果服務。免費試用期間15天,收費最便宜的價格是每個月350美金!。因為價格關係,所以我就沒有試用了,想了解使用方式的可以參考工作坊講義收費資訊


DroneDeploy:有航線規劃APP和雲端運算網站,可以展示結果,運算後的資料可以測量長度、面積,可以有3D模型展示立體地形、植物健康度(類似NDVI)、高度圖等。註冊後,會有一個月的Pro等級的試用期,可以做十張地圖,上述各種分析功能都有。等到試用期結束(或是地圖額度用完),會轉換成Explorer的等級,可以免費使用,但是每個月只有5張地圖的額度,而且前述一些特殊分析功能是沒有的,也無法下載運算的結果。收費的話是一個月99美金,詳細價格資訊如此連結


這是我拍攝的頭前溪的鷺鷥林,再用DroneDeploy的雲端服務建的照片。4.8公頃的土地,61張照片
http://drdp.ly/Zmwsi5

2D



3D



高度



植物健康度(看哪邊有多綠)




Altizure:香港科技大學創新公司開發的軟體與服務,所以中文界面使用上沒有問題。航線規劃、線上展示與分析的功能做得很棒,分析的功能甚至可以分析填方、挖方。如果有人在山裡挖了一個洞,你想知道他挖了多大的洞,你進行空拍與線上運算之後,就可以用填方去分析(要把洞填平為地面有多少體積)。或是你想當愚公去移山,你就可以用挖方分析要移走多少土石。

製作好的3D模型展示非常令人驚豔,像底下這是台灣的使用者拍攝土石流或坍方的現地模型,還有這個是亞洲水泥在新城的礦區。使用者註冊之後,可以製作無限個模型,但是每個地圖能使用的圖片是有限制的,剛開始都只能用30億像素的圖片(以Dji Phantom 4的預設照片,大約是150張),但如果模型製作得好,被編輯青睞,是有機會調高額度的。

免費等級的功能最大的限制是不能下載製作好的成果,只能線上觀看。如果想要下載,收費的方式是按件計費,以前述30億像素的模型來說,大約是台幣1000多元。費用資訊如此


*********************************************************************
針對以上幾種收費服務,如果純粹想要拍攝建模與展示,那麼可以用Altizure。而如果有下載分析處理的需求,可以買DroneDeploy一個月的權限,99美金,可以無限製作地圖,然後在這一個月內把圖片都上傳上去處理再下載回來。


如果是想要享有自由免費運用的運算結果,比方說你是有連續長期的分析監控需求的,那麼以下兩個分別是開放原始碼的軟體,以及圖資存放與展示的平台會蠻適合的,但是使用上有門檻啊。


OpenDroneMap:安裝於本機上的開放原始碼軟體,有另外的web使用界面,叫做WebODM。安裝上會用到docker,有點門檻,我花了一天才搞懂。但安裝後,使用web界面的webODM操作很簡單,運算是使用本機資源,所以就會花不少時間在拼圖,運算後有很多種結果,像是點雲、GeoTIFF等,也可以用web界面做長度、面積測量或是展示,要運用在GIS分析研究是相當適合。

webodm的上傳照片與處理照片的介面





利用webodm的介面做影像測量




webodm的3D點雲模型



webodm可以產生的檔案類型,除此外也可以做出DTM數值高程模型。





OpenAerialMap:是正射空拍地圖的展示與下載開放平台,可用QGIS的plugin下載影像進行分析。如果是使用OpenDroneMap來製圖,就可以用這個平台來展示與分享。
這是把DroneDeploy製作好的影像再上傳到OpenAerialMap
https://map.openaerialmap.org/#/121.0764491558075,24.757641316553684,18/13212312220/597f462146e19904aab0a91d?_k=t6xkgg