,请问为什么我运行程序什么图像也看不到,一直黑屏,运行也不报错,一直在运行但没图像输出,在下面加了个print(1)是有输出的

Viewed 41
import os
import ujson
import aicube
from libs.PipeLine import ScopedTiming
from libs.Utils import *
from media.sensor import *
from media.display import *
from media.media import *
import nncase_runtime as nn
import ulab.numpy as np
import image
import gc
from machine import UART
from machine import FPIOA
import time, sys, gc, json
from machine import TOUCH


lcd_width = 800
lcd_height = 480
DETECT_WIDTH = 320    # 目标检测的宽度
DETECT_HEIGHT = 240   # 目标检测的高度
CROP_WIDTH = 160      # 裁剪区域的宽度
CROP_HEIGHT = 120     # 裁剪区域的高度

sensor = Sensor() #构建摄像头对象,将摄像头长宽设置为4:3
#sensor_width = sensor.width(None)   # 获取传感器原始宽度
#sensor_height = sensor.height(None) # 获取传感器原始高度

sensor.reset()
sensor.set_framesize(width=640, height=480) #设置帧大小,默认通道0
sensor.set_hmirror(False)
sensor.set_vflip(False)
#sensor.set_transpose(False)
sensor.set_pixformat(Sensor.RGB565)

#sensor.set_framesize(Sensor.VGA)

#sensor.set_contrast(0) #对比度
#sensor.set_windowing([200,120,240,240])
sensor.set_framesize(
    width=DETECT_WIDTH,
    height=DETECT_HEIGHT,
    crop=((DETECT_WIDTH - CROP_WIDTH) // 2, (DETECT_HEIGHT - CROP_HEIGHT) // 2, CROP_WIDTH, CROP_HEIGHT)
)
#sensor.skip_frames(time = 2000)
#exposure = sensor.get_exposure_us()
#sensor.set_auto_exposure(False,exposure_us=500)  #
Display.init(Display.ST7701, width=lcd_width, height=lcd_height, to_ide=True)
MediaManager.init() #初始化media资源管理器

sensor.run() #启动sensor
clock = time.clock()

#黑框和白底的颜色阈值,可以宽泛一些。如果效果不好,则打开我注释掉的
thr_write = (60, 100, -20, 20, -20, 20)
thr_black = (0, 35, -20, 20, -20, 20)

count = 0 #测试切换像素的临时变量
state = 1  #测试切换像素的临时变量

target_offset = [-1,-1] #目标补偿量,根据视角倾斜角度而设,暂时手动填写
target = [0,0] #目标坐标,自动计算
view_offset = [0,0] #视角偏移补偿量,自动计算
deviation = [0,0] #偏差量,最终输出结果
while(True):
#    timer = millis()
    clock.tick()
    '''
    count += 1
    if count > 40:
        count = 0
        if state == 1:
            state = 0
            #sensor.reset()
            #sensor.set_pixformat(sensor.RGB565)
            sensor.set_framesize(sensor.QVGA)
        else:
            state = 1
            #sensor.reset()
            #sensor.set_pixformat(sensor.RGB565)
            sensor.set_framesize(sensor.VGA)
            sensor.set_windowing(320,240)
    '''

    img = sensor.snapshot()

    black_blobs = img.find_blobs([thr_black],merge =False) #找黑框

    if black_blobs:  #如果有目标
        print(1)
        for single_black_blob in black_blobs:
            #img.draw_rectangle(single_black_blob.rect(),color=(255,0,255)) #绘制初步找黑框结果
            #找到的目标中,符合阈值的面积和总的区域之间的比值。因为黑框内部不是黑色,所以这个比值不会很大。
            if single_black_blob.pixels() / (single_black_blob.w()*single_black_blob.h()) < 0.3:
                #img.draw_rectangle(single_black_blob.rect(),color=(0,255,255))#绘制符合条件的区域
                #在区域内找白色
                write_blobs = img.find_blobs([thr_write],area_threshold=2,roi =single_black_blob.rect(), merge =False)
                if write_blobs:#如果有目标
                    largest_white = max(write_blobs, key=lambda b: b.area())#找到最大的块
                    #img.draw_rectangle(largest_white.rect(),color=(255,0,0)) #绘制识别结果
                    #p = single_black_blob.pixels() / (single_black_blob.w()*single_black_blob.h())
                    #img.draw_string(largest_white.x(),largest_white.y(),str(p),color=(255,0,0))#在屏幕上显示测试数据
                    #绘制黑框的中心点
                    #img.draw_cross(single_black_blob.cx()+target_offset[0],single_black_blob.cy()+target_offset[1],color=(0,255,255))
                    #判断条件1:黑色区域面积和白色区域面积的比例;判断条件2:黑框和白色区域中心坐标的差值

                    if (2 < largest_white.pixels() / single_black_blob.pixels() < 4) and\
                        abs( largest_white.cx() - single_black_blob.cx() ) < 10 and \
                        abs( largest_white.cy() - single_black_blob.cy() ) < 10 :

                        target = [largest_white.cx()+target_offset[0], largest_white.cy()+target_offset[1] ] #白色区域中心坐标
                        img.draw_cross(target,color=(255,0,0),thickness=3) #绘制在画布上
    #print('目标',target)
    view_offset[0] += round((target[0]-120)*0.5) #偏差量累加到视野补偿中。120是画面中心坐标
    view_offset[1] += round((target[1]-120)*0.5)

    view_offset[0] = min(200, max(0, view_offset[0] )) #限制视野补偿的最大、最小值
    view_offset[1] = min(120, max(0, view_offset[1] ))

    #包含视野补偿的偏差量。这是最终用于云台运动的量!但注意,画布的Y轴与直角坐标系的Y周相反!
    err = [target[0]+view_offset[0]-200, target[1]+view_offset[1]-120]
    #print('执行量',err)
    img.draw_line(0,120, 240,120)
    img.draw_line(120,0,120,240)
    img.draw_circle(err[0]+120,err[1]+120,5,fill=True,color=(255,0,0)) #将总的偏差量绘制在画布上

    #因为画面有数码变焦的裁切,所以此功能通过改变裁切位置,让靶始终处于画面中心。如果不需要可以注释掉整个这部分。
#    sensor.set_windowing([200+view_offset[0], 120+view_offset[1], 240,240])
    #print(200+view_offset[0], 120+view_offset[1])
#    timer = millis() - timer
#    print('用时',timer,'实时帧速',1000/timer,'平均帧速',clock.fps())

重现步骤

期待结果和实际结果

软硬件版本信息

错误日志

尝试解决过程

补充材料

3 Answers

是我从openmv移植代码

你没有调用Display.show_image(img)

你好,你得代码中没有调用显示图像得api。

import os
import ujson
import aicube
from libs.PipeLine import ScopedTiming
from libs.Utils import *
from media.sensor import *
from media.display import *
from media.media import *
import nncase_runtime as nn
import ulab.numpy as np
import image
import gc
from machine import UART
from machine import FPIOA
import time, sys, gc, json
from machine import TOUCH


lcd_width = 800
lcd_height = 480
DETECT_WIDTH = 320    # 目标检测的宽度
DETECT_HEIGHT = 240   # 目标检测的高度
CROP_WIDTH = 160      # 裁剪区域的宽度
CROP_HEIGHT = 120     # 裁剪区域的高度

sensor = Sensor() #构建摄像头对象,将摄像头长宽设置为4:3
#sensor_width = sensor.width(None)   # 获取传感器原始宽度
#sensor_height = sensor.height(None) # 获取传感器原始高度

sensor.reset()
sensor.set_framesize(width=640, height=480) #设置帧大小,默认通道0
sensor.set_hmirror(False)
sensor.set_vflip(False)
#sensor.set_transpose(False)
sensor.set_pixformat(Sensor.RGB565)

#sensor.set_framesize(Sensor.VGA)

#sensor.set_contrast(0) #对比度
#sensor.set_windowing([200,120,240,240])
sensor.set_framesize(
    width=DETECT_WIDTH,
    height=DETECT_HEIGHT,
    crop=((DETECT_WIDTH - CROP_WIDTH) // 2, (DETECT_HEIGHT - CROP_HEIGHT) // 2, CROP_WIDTH, CROP_HEIGHT)
)
#sensor.skip_frames(time = 2000)
#exposure = sensor.get_exposure_us()
#sensor.set_auto_exposure(False,exposure_us=500)  #
Display.init(Display.ST7701, width=lcd_width, height=lcd_height, to_ide=True)
MediaManager.init() #初始化media资源管理器

sensor.run() #启动sensor
clock = time.clock()

#黑框和白底的颜色阈值,可以宽泛一些。如果效果不好,则打开我注释掉的
thr_write = (60, 100, -20, 20, -20, 20)
thr_black = (0, 35, -20, 20, -20, 20)

count = 0 #测试切换像素的临时变量
state = 1  #测试切换像素的临时变量

target_offset = [-1,-1] #目标补偿量,根据视角倾斜角度而设,暂时手动填写
target = [0,0] #目标坐标,自动计算
view_offset = [0,0] #视角偏移补偿量,自动计算
deviation = [0,0] #偏差量,最终输出结果
while(True):
#    timer = millis()
    clock.tick()
    '''
    count += 1
    if count > 40:
        count = 0
        if state == 1:
            state = 0
            #sensor.reset()
            #sensor.set_pixformat(sensor.RGB565)
            sensor.set_framesize(sensor.QVGA)
        else:
            state = 1
            #sensor.reset()
            #sensor.set_pixformat(sensor.RGB565)
            sensor.set_framesize(sensor.VGA)
            sensor.set_windowing(320,240)
    '''

    img = sensor.snapshot()

    black_blobs = img.find_blobs([thr_black],merge =False) #找黑框

    if black_blobs:  #如果有目标
        print(1)
        for single_black_blob in black_blobs:
            #img.draw_rectangle(single_black_blob.rect(),color=(255,0,255)) #绘制初步找黑框结果
            #找到的目标中,符合阈值的面积和总的区域之间的比值。因为黑框内部不是黑色,所以这个比值不会很大。
            if single_black_blob.pixels() / (single_black_blob.w()*single_black_blob.h()) < 0.3:
                #img.draw_rectangle(single_black_blob.rect(),color=(0,255,255))#绘制符合条件的区域
                #在区域内找白色
                write_blobs = img.find_blobs([thr_write],area_threshold=2,roi =single_black_blob.rect(), merge =False)
                if write_blobs:#如果有目标
                    largest_white = max(write_blobs, key=lambda b: b.area())#找到最大的块
                    #img.draw_rectangle(largest_white.rect(),color=(255,0,0)) #绘制识别结果
                    #p = single_black_blob.pixels() / (single_black_blob.w()*single_black_blob.h())
                    #img.draw_string(largest_white.x(),largest_white.y(),str(p),color=(255,0,0))#在屏幕上显示测试数据
                    #绘制黑框的中心点
                    #img.draw_cross(single_black_blob.cx()+target_offset[0],single_black_blob.cy()+target_offset[1],color=(0,255,255))
                    #判断条件1:黑色区域面积和白色区域面积的比例;判断条件2:黑框和白色区域中心坐标的差值

                    if (2 < largest_white.pixels() / single_black_blob.pixels() < 4) and\
                        abs( largest_white.cx() - single_black_blob.cx() ) < 10 and \
                        abs( largest_white.cy() - single_black_blob.cy() ) < 10 :

                        target = [largest_white.cx()+target_offset[0], largest_white.cy()+target_offset[1] ] #白色区域中心坐标
                        img.draw_cross(target,color=(255,0,0),thickness=3) #绘制在画布上
    #print('目标',target)
    view_offset[0] += round((target[0]-120)*0.5) #偏差量累加到视野补偿中。120是画面中心坐标
    view_offset[1] += round((target[1]-120)*0.5)

    view_offset[0] = min(200, max(0, view_offset[0] )) #限制视野补偿的最大、最小值
    view_offset[1] = min(120, max(0, view_offset[1] ))

    #包含视野补偿的偏差量。这是最终用于云台运动的量!但注意,画布的Y轴与直角坐标系的Y周相反!
    err = [target[0]+view_offset[0]-200, target[1]+view_offset[1]-120]
    #print('执行量',err)
    img.draw_line(0,120, 240,120)
    img.draw_line(120,0,120,240)
    img.draw_circle(err[0]+120,err[1]+120,5,fill=True,color=(255,0,0)) #将总的偏差量绘制在画布上

    Display.show_image(img)
    #因为画面有数码变焦的裁切,所以此功能通过改变裁切位置,让靶始终处于画面中心。如果不需要可以注释掉整个这部分。
#    sensor.set_windowing([200+view_offset[0], 120+view_offset[1], 240,240])
    #print(200+view_offset[0], 120+view_offset[1])
#    timer = millis() - timer
#    print('用时',timer,'实时帧速',1000/timer,'平均帧速',clock.fps())