python实现阿帕奇的热成像瞄准OSD界面
smith2023/08/05极客DIY IP:广东

代码写得比较简单, 但效果做出来还可以。。。

配合着一个能跑python的win平板和一个热成像摄像头可以玩得不亦乐乎

不过就是电源的问题没解决, 解决了就可以户外了

frame7.jpg


frame10.jpg


frame1.jpg

用这段python代码就可以采集摄像头的数据了,我们接着要做的就是, 在上面画出十字和方框

import cv2
import numpy as np


if __name__ == '__main__':
    cap = cv2.VideoCapture(url)

    while(True):
        ret, frame = cap.read()

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()

画的过程不难, 但是毕竟麻烦

话不多说, 直接放出来吧

import cv2
import numpy as np




if __name__ == '__main__':
    
    img_count = 0
    cap = cv2.VideoCapture('url')
    w  = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))   # float `width`
    h = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))  # float `height`

    CROSS_W = int(w / 8)
    CROSS_H = int(h / 8)

    RETICLE_W_SIZE = int(w / 7)
    RETICLE_H_SIZE = int(w / 7)
    DELTA = 40
    SHIFT = 40
    DASH = 80

    while(True):
        ret, frame = cap.read()
        text_color = (255,0,0)
        c1 = int(w/2)
        c2 = int(h/2)

        x1 = int(w/2 - CROSS_W/2)
        y1 = int(h/2)

        x11 = int(w/2 - CROSS_W/2 + DASH/2)
        y11 = int(h/2)

        x2 = int(w/2 + CROSS_W/2)
        y2 = int(h/2)

        x21 = int(w/2 + CROSS_W/2 - DASH/2)
        y21 = int(h/2)

        x3 = int(w/2)
        y3 = int(h/2 - CROSS_H/2)

        x31 = int(w/2)
        y31 = int(h/2 - CROSS_H/2 + DASH/2)

        x4 = int(w/2)
        y4 = int(h/2 + CROSS_H/2)

        x41 = int(w/2)
        y41 = int(h/2 + CROSS_H/2 - DASH/2)

        x5 = int(w/2 - RETICLE_W_SIZE/2 - SHIFT)
        y5 = int(h/2 - RETICLE_H_SIZE/2)

        x51 = int(w/2 - RETICLE_W_SIZE/2 - SHIFT)
        y51 = int(h/2 - RETICLE_H_SIZE/2 +  DELTA)

        x52 = int(w/2 - RETICLE_W_SIZE/2 -SHIFT + DELTA)
        y52 = int(h/2 - RETICLE_H_SIZE/2)


        x6 = int(w/2 + RETICLE_W_SIZE/2 + SHIFT)
        y6 = int(h/2 - RETICLE_H_SIZE/2)

        x61 = int(w/2 + RETICLE_W_SIZE/2 + SHIFT)
        y61 = int(h/2 - RETICLE_H_SIZE/2 +  DELTA)

        x62 = int(w/2 + RETICLE_W_SIZE/2 + SHIFT - DELTA)
        y62 = int(h/2 - RETICLE_H_SIZE/2)

        x7 = int(w/2 - RETICLE_W_SIZE/2 - SHIFT)
        y7 = int(h/2 + RETICLE_H_SIZE/2)

        x71 = int(w/2 - RETICLE_W_SIZE/2 - SHIFT)
        y71 = int(h/2 + RETICLE_H_SIZE/2 -  DELTA)

        x72 = int(w/2 - RETICLE_W_SIZE/2 - SHIFT + DELTA)
        y72 = int(h/2 + RETICLE_H_SIZE/2)

        x8 = int(w/2 + RETICLE_W_SIZE/2 + SHIFT)
        y8 = int(h/2 + RETICLE_H_SIZE/2)

        x81 = int(w/2 + RETICLE_W_SIZE/2 - SHIFT + DELTA)
        y81 = int(h/2 + RETICLE_H_SIZE/2)

        x82 = int(w/2 + RETICLE_W_SIZE/2 + SHIFT)
        y82 = int(h/2 + RETICLE_H_SIZE/2 - DELTA) 

        #cv2.line(frame,(x1,y1),(x2,y2),(255,255,255),1,cv2.LINE_AA)
        #cv2.line(frame,(x3,y3),(x4,y4),(255,255,255),1,cv2.LINE_AA)
        cv2.circle(frame, (c1,c2), radius=0, color=(255, 255, 255), thickness=-1)
        cv2.line(frame,(x1,y1),(x11,y11),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x2,y2),(x21,y21),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x3,y3),(x31,y31),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x4,y4),(x41,y41),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x5,y5),(x51,y51),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x5,y5),(x52,y52),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x6,y6),(x61,y61),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x6,y6),(x62,y62),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x7,y7),(x71,y71),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x7,y7),(x72,y72),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x8,y8),(x81,y81),(255,255,255),1,cv2.LINE_AA)
        cv2.line(frame,(x8,y8),(x82,y82),(255,255,255),1,cv2.LINE_AA)

        cv2.putText(frame,'Thermal IR',(64,64),cv2.FONT_HERSHEY_COMPLEX,1,(255,255,255),1,cv2.LINE_AA)

        cv2.imshow('frame',frame)

        if cv2.waitKey(1) & 0xFF == ord('s'):
            cv2.imwrite("frame%d.jpg" % img_count, frame)
            img_count = img_count + 1
            print("save one frame ok!")
            
    

        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

    cap.release()
    cv2.destroyAllWindows()


如果你身边没有热成像摄像头, 用一般的摄像头也可以, 但是

    cap = cv2.VideoCapture(url)

这一行要换成自己的摄像头地址

[修改于 8个月25天前 - 2023/08/06 10:03:48]

来自:综合交流区 / 极客DIY
2
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
smith 作者
8个月25天前 IP:广东
923647

改进了一下,

后面再考虑加上测距和陀螺仪模块


frame14.jpg


frame0.jpg

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
badbug
8个月7天前 IP:广东
924603

这个热成像摄像头用的是什么?

引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
smith
学者 机友 笔友
文章
184
回复
2269
学术分
4
2015/01/11注册,2天2时前活动

收音机爱好者

主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:广东
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}