• 星瞳AI VISION软件内测!可以离线标注,训练,并生成OpenMV的模型。可以替代edge impulse https://forum.singtown.com/topic/8206
  • 我们只解决官方正版的OpenMV的问题(STM32),其他的分支有很多兼容问题,我们无法解决。
  • 如果有产品硬件故障问题,比如无法开机,论坛很难解决。可以直接找售后维修
  • 发帖子之前,请确认看过所有的视频教程,https://singtown.com/learn/ 和所有的上手教程http://book.openmv.cc/
  • 每一个新的提问,单独发一个新帖子
  • 帖子需要目的,你要做什么?
  • 如果涉及代码,需要报错提示全部代码文本,请注意不要贴代码图片
  • 必看:玩转星瞳论坛了解一下图片上传,代码格式等问题。
  • 使用LCD模块,3分钟就死机,请问是什么原因?



    • 前几天买了OpenMV4 Cam H7 R2 ,运行正常,为了调试方便,购买了一块LCD模块,在PC上调试一切正常,偶尔提示 Fame Capable Time out.
      但是只要脱机运行,运行不要几分钟就泵机了,请问大家遇到过么?该怎么解决这个问题?

      import sensor, image, time, math,lcd
      thresholds = [(0, 58, 7, 67, -16, 127),
                 (0, 47, -128, 6, -128, 28)]
      DisplayColor=[(0,0,0),(255,0,0),(0,0,0),(0,0,255)]
      PraRoi=(185,106,12,27)
      sensor.reset()
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QVGA)
      sensor.skip_frames(time = 10000)
      sensor.set_auto_gain(True)
      sensor.set_auto_whitebal(True)
      lcd.init()
      clock = time.clock()
      lcd.set_backlight(50)
      i=1
      dcx=0
      dcy=0
      while(True):
          clock.tick()
          img = sensor.snapshot()
          codenum=0
          img.draw_rectangle(PraRoi,color=(0,255,0))
          for blob in img.find_blobs(thresholds,roi=PraRoi, pixels_threshold=10, area_threshold=10,merge=False):
              img.draw_edges(blob.min_corners(), color=(255,0,0))
              if blob.code()==1 :
                       codenum=1
                       dcx=int(blob.cx())
                       dcy=int(blob.cy())
                       img.draw_string(5,5,str(blob.code())+"x"+str(dcx)+" y"+str(dcy),scale = 2)
              elif  blob.code()==2:
                       img.draw_string(5,35,str(blob.code())+"x"+str(blob.cx())+" y"+str(blob.cy()),scale = 2)
                       deltaX=" x"+"{0:>3}".format(str(blob.cx()-dcx))
                       deltaY=" y"+"{0:>3}".format(str(blob.cy()-dcy))
                       img.draw_string(5,60,deltaX+deltaY,scale = 2)
                       codenum=2
                       if  blob.cx()-dcx <0 or blob.cx()-dcx >50  :
                           img.draw_string(5,80,str(i)+deltaX+deltaY,scale = 2,color=(255,0,0))
                           i=i+1
                           if i>30 :
                              i=0
                              dcx=blob.cx()
                              dcy=blob.cy()
              img.draw_cross(blob.cx(), blob.cy(),color=DisplayColor[blob.code()])
          lcd.display(img,x_scale=0.4,x_scale=0.6)
          print(clock.fps())
      
      

      泵机以后LCD模块全亮,画面静止不动。



    • 经过一天的分析和实验,
      先说结论:MCU性能不够
      分析原因可能有三个
      (1)可能使用了自动增益和白平衡,运算量增大。(提供了光源,光源切换不久就泵机了。)
      (2)blobs分析 运算量大(发热量明显增加,这个可能是正常的温升)
      (3) LCD模块需要显示整个摄像头的图像 增加了 Scale ,导致运算量加大。(目前只是猜测)

      目前解决方法:
      因为工业设备中用光源是必须提供的,增加282810的散热片, 降了5-10°的样子(昨天MCU烫手,今天散热片摸起来烫但不明显),放弃LCD的Scale, Blobs分析的Roi 区域调整,将显示字符串的位置调整,方便调试

      状况:
      目前已经跑了一个晚上,目前一切正常,今天继续试跑一天。
      后续增加补光模块,用Pin控制LED用于程序运行状态的显示。



    • 2楼的分析可能是错的,问题依旧没有解决!
      请大家给分析一下是什么原因!
      为了解决散热,我将整个模块从保护壳(自制滴塑料密封结构)拿到室内环境,
      泵机现象再次出现。
      泵机前,主板上的红色的ED闪几下,然后LCD屏突然最亮(亮度最大,图像停止更新!),MCU芯片温度无异常(估计30-40摄氏度而已)。
      我要崩溃了。

      这个问题不解决,产线上使用的想法是泡汤了。请问大家是否遇到过这个现象,能帮我分析一下原因么?



    • 你脱机运行的电源是什么?使用USB供电脱机运行是否正常?



    • 绿联的7口USB3.0 HUB, 绿联的供电电源是12V2A。



    • 你用电脑的USB脱机运行也会死机吗?



    • 可有可能是代码在哪里报错了,脱机运行看不到。

      可以在代码最外面加 try, 如果捕获异常就闪灯

      import sensor, image, time
      sensor.reset()                      # Reset and initialize the sensor.
      sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
      sensor.set_framesize(sensor.QVGA)   # Set frame size to QVGA (320x240)
      sensor.skip_frames(time = 2000)     # Wait for settings take effect.
      clock = time.clock()                # Create a clock object to track the FPS.
      
      try:
          # raise "error"
          while(True):
              clock.tick()                    # Update the FPS clock.
              img = sensor.snapshot()         # Take a picture and return the image.
              print(clock.fps())              # Note: OpenMV Cam runs about half as fast when connected
                                              # to the IDE. The FPS should increase once disconnected.
      except:
          from pyb import LED
          
          red_led   = LED(1)
          while(True):
              red_led.on()
              time.sleep_ms(1000)
              red_led.off()
              time.sleep_ms(1000)
          
      


    • This post is deleted!


    • @kidswong999使用LCD模块,3分钟就死机,请问是什么原因? 中说:

      你用电脑的USB脱机运行也会死机吗?

      一样的,电源的可能性个人感觉不可能,因为没有其它需要大电流的设备,每个USB口至少应该有500mA的电流(手机充电试过了电流应该可以到2A)。



    • @kidswong999使用LCD模块,3分钟就死机,请问是什么原因? 中说:

      可有可能是代码在哪里报错了,脱机运行看不到。

      可以在代码最外面加 try, 如果捕获异常就闪灯

      import sensor, image, time
      sensor.reset()                      # Reset and initialize the sensor.
      sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE)
      sensor.set_framesize(sensor.QVGA)   # Set frame size to QVGA (320x240)
      sensor.skip_frames(time = 2000)     # Wait for settings take effect.
      clock = time.clock()                # Create a clock object to track the FPS.
      
      try:
          # raise "error"
          while(True):
              clock.tick()                    # Update the FPS clock.
              img = sensor.snapshot()         # Take a picture and return the image.
              print(clock.fps())              # Note: OpenMV Cam runs about half as fast when connected
                                              # to the IDE. The FPS should increase once disconnected.
      except:
          from pyb import LED
          
          red_led   = LED(1)
          while(True):
              red_led.on()
              time.sleep_ms(1000)
              red_led.off()
              time.sleep_ms(1000)
          
      

      谢谢,为了直观,我增加了一个记录用时(秒)的计算 ,并在LCD上显示:

      import sensor, image, time, math,lcd,pyb
      thresholds = [(0, 58, 7, 67, -16, 127),
      		   (0, 47, -128, 6, -128, 28)]
      DisplayColor=[(0,0,0),(255,0,0),(0,0,0),(0,0,255)]
      PraRoi=(75,75,20,84)
      sensor.reset()
      sensor.reset()
      sensor.set_pixformat(sensor.RGB565)
      sensor.set_framesize(sensor.QVGA)
      sensor.skip_frames(time = 5000)
      sensor.set_auto_gain(True)
      sensor.set_auto_whitebal(True)
      lcd.init()
      clock = time.clock()
      lcd.set_backlight(50)
      i=1
      dcx=0
      dcy=0
      t1=pyb.millis()
      while(True):
      	clock.tick()
      	img = sensor.snapshot()
      	codenum=0
      	img.draw_rectangle(PraRoi,color=(0,255,0))
      	for blob in img.find_blobs(thresholds,roi=PraRoi, pixels_threshold=20, area_threshold=20,merge=False):
      		img.draw_edges(blob.min_corners(), color=(255,0,0))
      		if blob.code()==1 :
      				 codenum=1
      				 dcx=int(blob.cx())
      				 dcy=int(blob.cy())
      				 img.draw_string(5,5,str(blob.code())+"x"+str(dcx)+" y"+str(dcy),scale = 2)
      		elif  blob.code()==2:
      				 img.draw_string(5,35,str(blob.code())+"x"+str(blob.cx())+" y"+str(blob.cy()),scale = 2)
      				 deltaX=" x"+"{0:>3}".format(str(blob.cx()-dcx))
      				 deltaY=" y"+"{0:>3}".format(str(blob.cy()-dcy))
      				 img.draw_string(5,60,deltaX+deltaY,scale = 2)
      				 codenum=2
      				 if  blob.cx()-dcx <0 or blob.cx()-dcx >50  :
      					 img.draw_string(5,80,str(i)+deltaX+deltaY,scale = 2,color=(255,0,0))
      					 i=i+1
      					 if i>30 :
      						i=0
      						dcx=blob.cx()
      						dcy=blob.cy()
      		img.draw_cross(blob.cx(), blob.cy(),color=DisplayColor[blob.code()])
      	t2=pyb.elapsed_millis(t1)/1000
      	img.draw_string(5,130,str(int(t2)),scale = 4,color=(255,0,0))
      	lcd.display(img,x_scale=0.4,x_scale=0.6)
      	print(clock.fps())
      

      结果是,基本不到200S以后就泵机了,运行的视频和泵机后的视频已经发给客服了,很奇怪的是,昨天有一次跑了大概4600s后泵机,今天还在跑看看具体情况。
      节后买个独立电源。



    • 哦,忘了两个事,

      1. 因为发热量大,散热块与摄像头有接触,可能高温影响了摄像头(几秒以后画面是黑白的),我将散热快调转了180°,摄像头温度降下来了。
        2)换了一个焦距4.0的镜头,提高识别像素的分辨率。
        其它的没有变动。
        供大家参考分析