您好,登錄后才能下訂單哦!
這篇“python如何實現(xiàn)DIY照相機”文章的知識點大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“python如何實現(xiàn)DIY照相機”文章吧。
攝像頭(CAMERA或WEBCAM)又稱為電腦相機、電腦眼、電子眼等,是一種視頻輸入設(shè)備,被廣泛的運用于視頻會議,安防系統(tǒng) 、圖像采集系統(tǒng)、 環(huán)境監(jiān)控 、工業(yè)現(xiàn)場過程控制 等方面。本實驗用TPYBoard v102以及PTC06 串口攝像頭模塊DIY一個簡易的照相機。
1.所用器材:
l TPYBoard v102 1塊
l PTC06 串口攝像頭模塊1個
l 杜邦線若干
l TF卡1個
l 下載數(shù)據(jù)線1條
2.TPYBoard v102簡介:
TPYBoardv102主控芯片采用STM32F405,M4的內(nèi)核,168MHZ的最高運行速度,1024KB的Flash,192KB的RAM,內(nèi)置SD卡槽,最大支持8G內(nèi)存的內(nèi)存卡。板載四個LED燈和一個加速度傳感器。TPYBoard v102板載30個通用GPIO接口、 2個SPI接口、2個CAN接口、2個I2C接口、 5個USART 接口、 2個ADC接口(精度12bit )、2個DAC接口、1個SWD接口??膳c大部分常用傳感器模塊連接。
3. PTC06 串口攝像頭模塊簡介:
PTC06 串口攝像頭模塊是一款集圖像采集、拍攝控制、數(shù)據(jù)壓縮、串口傳輸于一體的工業(yè)級圖像采集處理模塊。其內(nèi)置的高性能數(shù)字信號處理芯片實現(xiàn)了對原始圖像的高比例壓縮。產(chǎn)品圖像輸 出采用標準 JPEG 格式,可方便地兼容各種圖像處理軟件;采用 3 線制 TTL 電平 UART 通 信接口,可以方便地實現(xiàn)與單片機或其他微處理器連接。
默認波特率為 115200,其它可選波特率有 9600,19200,38400 和 57600。
其中對于串口控制拍照,讀取靜態(tài)圖片的應(yīng)用中,只需要用到 GND,RX,TX,VCC 這 4 個信號線。 如果是要輸出模擬視頻的應(yīng)用,才需要將 CVBS 信號。注意: TX 和 RX 是 3.3v 的 TTL 電平信號。
4.接線方式:
5.實驗步驟.
基本原理:TPYboard v102 通過串口與串口攝像頭模塊(PTC06)進行連接,通過按鍵控制模塊進行拍照,并保存到TF卡中。上電后,等待ToyBoard v102板載綠燈亮起,說明攝像頭模塊初始化完畢,按一下USR鍵,控制攝像頭進行拍照,藍燈會閃爍,說明正在傳輸圖片數(shù)據(jù),等待藍燈熄滅后,說明傳輸完畢。按一下rst鍵讓板子重新加載一下TF卡,打開TF卡就會看到一個新生成的jpeg文件。
6.源代碼:
""" #TPYBoard v102 驅(qū)動串口攝像頭PTC06 拍照并保存到TF卡 #------------------------------------------------------ #作者:山東蘿卜電子科技有限公司 #時間:2018年03月15日 """ import pyb from pyb import UART,Switch """ 拍照的基本流程 -------------------- 1.清空圖片緩存 2.發(fā)送拍照命令 3.獲取圖片的長度 4.根據(jù)長度讀取圖片數(shù)據(jù) 使用到的指令與返回的數(shù)據(jù)格式 ------------------------------- 復(fù)位 0x56 0x00 0x26 0x00 返回 0x76 0x00 0x26 0x00 +DSP 版本信息+Init end ------------------------ 清空圖片緩存 0x56 0x00 0x36 0x01 0x02 返回 0x76 0x00 0x36 0x00 0x00 ------------------------- 拍照命令 0x56 0x00 0x36 0x01 0x00 返回 0x76 0x00 0x36 0x00 0x00 -------------------------- 讀所拍圖片的長度 56 00 34 01 00 返回 0x76 0x00 0x34 0x00 0x04 0x00 0x00 XX YY (XX 為高位字節(jié),YY 為低位字節(jié)) -------------------------- 讀取圖片數(shù)據(jù) 0x56 0x00 0x32 0x0C 0x00 0x0A 0x00 0x00 AA BB 0x00 0x00 XX YY 0x00 0xFF AA BB:起始地址(先高位字節(jié),后低位字節(jié).必須是8的倍數(shù)) XX YY:本次讀的數(shù)據(jù)長度(先高位字節(jié),后低位字節(jié)) 返回 76 00 32 00 00 FF D8 ....... FF D9 76 00 32 00 00 (完整的JPEG 圖片文件是以 FF D8 開始 FF D9 結(jié)尾) """ #-----Command---------# initcmd=b'\x56\x00\x26\x00' #復(fù)位指令 clearcmd=b'\x56\x00\x36\x01\x02' #清除緩存 photocmd=b'\x56\x00\x36\x01\x00' #拍照 lengthcmd=b'\x56\x00\x34\x01\x00' #獲取圖片長度 readcmd=b'\x56\x00\x32\x0C\x00\x0A\x00\x00' #獲取圖片數(shù)據(jù) responseCmd=b'\x76\x00\x32\x00\x00'#返回的圖片數(shù)據(jù)固定頭和尾 #---------------------------------# isFlag=0#標識是否初始化 isPhoto=0#標識是否發(fā)送拍照命令 num=1 f_name='/sd/photo%s.jpeg'#保存的文件名稱 nBytes=512#每次讀取的字節(jié)數(shù) #---------------------------------# uart=UART(4,115200,timeout=100)#串口4 TX-X1 RX-X2 #------將10進制轉(zhuǎn)為16進制字節(jié)數(shù)組--------# def convert_Data(num): if num>255: num_h=hex(num) if len(num_h)<6: num_h_a=num_h[:3] num_h_b='0x'+num_h[3:] else: num_h_a=num_h[:4] num_h_b='0x'+num_h[4:] byte_num=bytes([int(num_h_a,16),int(num_h_b,16)]) else: byte_num=b'\x00'+bytes([num]) return byte_num #--------------------------------- #函數(shù)名:get_photo #描述:獲取圖片數(shù)據(jù) #參數(shù):起始地址、讀取長度 #返回:成功返回正常數(shù)據(jù),失敗返回0 #---------------------------------/ def get_photo(add,readlen): global readcmd,responseCmd cmd=readcmd+add+b'\x00\x00'+readlen+b'\x00\xFF' uart.write(cmd) while uart.any()<=0: continue data=uart.read() #print('data:',data) #print('data[0:5]:',data[0:5]) #print('data[-5:]:',data[-5:]) if data[0:5]==responseCmd and data[-5:]==responseCmd: revdata=data[5:-5] print('revdata:',revdata) else: revdata=0 return revdata #--------------------------------- #函數(shù)名:test #描述:USR按鍵的回調(diào)函數(shù)。 #按鍵每按1次拍照1次 #---------------------------------/ def test(): global num,isPhoto pyb.delay(30) if(sw()): sw.callback(None)#正在獲取數(shù)據(jù)時 禁用回調(diào) isPhoto=0 num+=1 pyb.LED(3).on() #清除緩存 uart.write(clearcmd) #等待模塊上電完畢 print('wait......') pyb.delay(2800) print('init start.......') uart.write(initcmd) sw=Switch() sw.callback(test) while True: if uart.any()>0: data=uart.read() print('revdata:',data) if isFlag==0: #說明接收的是復(fù)位后的信息 if data==b'Init end\r\n': #復(fù)位完畢 print('init ok.......') pyb.delay(2000) isFlag=1 pyb.LED(2).on() else: if len(data)>=5: if data[0]==118:#0x76 if data[2]==54:#0x36 if isPhoto==0: #清除緩存返回 print('-----clear buffer ok----') isPhoto=1 uart.write(photocmd) else: #拍照返回 print('-----taking pictures ok----') uart.write(lengthcmd) if data[2]==52:#0x34 print('photo length:',data[7],'-',data[8]) tlen=data[7]*256+data[8] t_c=tlen//nBytes t_y=tlen%nBytes add=0 #256=[0x01,0x00] 512=[0x02,0x00] length=convert_Data(nBytes) name=f_name % str(num) print('filename:',name) for i in range(0,t_c): add=convert_Data(i*nBytes) #每512字節(jié)寫一次 revdata=get_photo(add,length) if revdata!=0: f=open(name,'a') f.write(revdata) f.close() pyb.LED(4).toggle() print('-------------',i) pyb.delay(100) add=convert_Data(t_c*nBytes) revdata=get_photo(add,convert_Data(t_y)) if revdata!=0: f=open(name,'a') f.write(revdata) f.close() pyb.LED(3).off() pyb.LED(4).off() pyb.delay(100) print('*========================================*') sw.callback(test) else: print('-----data length error-----')
以上就是關(guān)于“python如何實現(xiàn)DIY照相機”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。