当前位置:   article > 正文

OPENMV脱机调阈值_openmv如何实现脱机调阈值

openmv如何实现脱机调阈值

用到了7个按钮,第一个用来选择是否进入调阈值模式。

后6个用来调整OPENMV阈值编辑器的6个滑动条

OPENMV代码

  1. import sensor, image, time, pyb,math, display
  2. from pyb import UART
  3. sensor.reset()
  4. sensor.set_framesize(sensor.QQVGA)
  5. sensor.set_pixformat(sensor.RGB565)
  6. sensor.skip_frames(time = 10)
  7. clock = time.clock()
  8. threshold_index = 0
  9. red=[24, 69, 16, 127, -128, 127]
  10. #
  11. uart = UART(3, 9600)
  12. lcd = display.SPIDisplay()
  13. while True:
  14. # 检查是否有数据可读
  15. if uart.any():
  16. # 读取数据
  17. data = uart.read()
  18. # 检查数据是否符合要求
  19. if len(data) >= 3 and data[0] == 0xa1 and data[1] == 0xb2 and data[-1] == 0xc3:
  20. # 打印接收到的数据包
  21. print("接收到的数据包:", list(data))
  22. if data[2]==0: thr = 0;
  23. if data[2]==1: thr = 1;
  24. if thr == 1:
  25. red[0]=data[3]
  26. red[1]=data[4]
  27. red[2]=data[5]-128
  28. red[3]=data[6]-128
  29. red[4]=data[7]-128
  30. red[5]=data[8]-128
  31. for i in range(100):
  32. clock.tick()
  33. img = sensor.snapshot()
  34. img.binary([red])
  35. lcd.write(img)
  36. print("阈值",list(red))
  37. print("data",data[8])
  38. if thr == 0:
  39. clock.tick()
  40. img = sensor.snapshot()
  41. # 拍照并显示图像。
  42. for blob in img.find_blobs([red],pixels_threshold=200,area_threshold=200):#循环blobs
  43. img.draw_rectangle(blob.rect())#返回这个色块的外框
  44. lcd.write(img)

 

 MSPM0G3507代码

  1. #include "ti_msp_dl_config.h"
  2. #include "oled.h"
  3. #include "stdio.h"
  4. uint8_t Serial_TxPacket[7]; //定义发送数据包数组,数据包格式:aa bb 01 02 03 04 cc
  5. int openmv_data[5]; //openmv发来的数据包
  6. //给OPENMV脱机调阈值发的数据
  7. int a1=0;
  8. int a2=0;
  9. int a3=0;
  10. int a4=0;
  11. int a5=0;
  12. int a6=0;
  13. int a7=0;
  14. /**
  15. * 函 数:串口发送一个字节
  16. * 参 数:Byte 要发送的一个字节
  17. * 返 回 值:无
  18. */
  19. void Serial_SendByte(uint8_t Byte)
  20. {
  21. DL_UART_Main_transmitDataBlocking(UART_1_INST ,Byte); //将字节数据写入数据寄存器,写入后USART自动生成时序波形
  22. }
  23. /**
  24. * 函 数:串口发送一个数组
  25. * 参 数:Array 要发送数组的首地址
  26. * 参 数:Length 要发送数组的长度
  27. * 返 回 值:无
  28. */
  29. void Serial_SendArray(uint8_t *Array, uint16_t Length)
  30. {
  31. uint16_t i;
  32. for (i = 0; i < Length; i ++) //遍历数组
  33. {
  34. Serial_SendByte(Array[i]); //依次调用Serial_SendByte发送每个字节数据
  35. }
  36. }
  37. /**
  38. * 函 数:串口发送数据包
  39. * 参 数:无
  40. * 返 回 值:无
  41. * 说 明:调用此函数后,Serial_TxPacket数组的内容将加上包头(FF)包尾(FE)后,作为数据包发送出去
  42. */
  43. void Serial_SendPacket(void)
  44. {
  45. Serial_SendByte(0xa1);
  46. Serial_SendByte(0xb2);
  47. Serial_SendArray(Serial_TxPacket, 7);
  48. Serial_SendByte(0xc3);
  49. }
  50. int data_test(int data[]) //判断数据是否合理的函数
  51. {
  52. if(data[4]!=0xc3) return 0; //帧尾
  53. //if(data[2]>150) return 0; //x坐标上限
  54. //if(data[3]>110) return 0; //y坐标上限
  55. return 1;
  56. }
  57. void delay_ms(uint32_t ms)
  58. {
  59. while(ms--)
  60. {
  61. delay_cycles(CPUCLK_FREQ/2500);
  62. }
  63. }
  64. int main(void)
  65. {
  66. SYSCFG_DL_init();
  67. OLED_Init(I2C_OLED_INST );//初始化OLED
  68. OLED_Clear(I2C_OLED_INST );//OLED清屏
  69. // NVIC_ClearPendingIRQ(UART_0_INST_INT_IRQN); //先清除一下中断,防止直接接入中断
  70. // NVIC_EnableIRQ(UART_0_INST_INT_IRQN); //开启串口的中断
  71. //NVIC_EnableIRQ(UART_1_INST_INT_IRQN); //允许串口1的中断,OPENMV中断
  72. while (1)
  73. {
  74. OLED_ShowFloat(I2C_OLED_INST , 0,0, a1, 3, 1, 8);
  75. OLED_ShowFloat(I2C_OLED_INST , 0,1, a2, 3, 1, 8);
  76. OLED_ShowFloat(I2C_OLED_INST , 0,2, a3, 3, 1, 8);
  77. OLED_ShowFloat(I2C_OLED_INST , 0,3, a4, 3, 1, 8);
  78. OLED_ShowFloat(I2C_OLED_INST , 0,4, a5, 3, 1, 8);
  79. OLED_ShowFloat(I2C_OLED_INST , 0,5, a6, 3, 1, 8);
  80. OLED_ShowFloat(I2C_OLED_INST , 0,6, a7, 3, 1, 8);
  81. //第一个按键用来判断是否进入调阈值模式
  82. if (DL_GPIO_readPins(KEY1_PORT_PORT ,KEY1_PORT_KET1_PIN_PIN )==KEY1_PORT_KET1_PIN_PIN) //按下为高电平
  83. {
  84. while(DL_GPIO_readPins(KEY1_PORT_PORT , KEY1_PORT_KET1_PIN_PIN )==KEY1_PORT_KET1_PIN_PIN) //一直按下
  85. {
  86. }
  87. //松手之后
  88. a1++; //a11则进入调阈值模式,a10则退出调阈值模式
  89. if(a1>1)
  90. {
  91. a1=0;
  92. }
  93. }
  94. //第二个按键调第一个阈值
  95. if (DL_GPIO_readPins(KEY2_PORT_PORT ,KEY2_PORT_KEY2_PIN_PIN )==KEY2_PORT_KEY2_PIN_PIN) //按下为高电平
  96. {
  97. while(DL_GPIO_readPins(KEY2_PORT_PORT , KEY2_PORT_KEY2_PIN_PIN )==KEY2_PORT_KEY2_PIN_PIN) //一直按下
  98. {
  99. }
  100. a2=a2+4;
  101. if(a2>100)
  102. {
  103. a2=0;
  104. }
  105. }
  106. //第三个按键调第二个阈值
  107. if (DL_GPIO_readPins(KEY3_PORT_PORT ,KEY3_PORT_KEY3_PIN_PIN )==KEY3_PORT_KEY3_PIN_PIN) //按下为高电平
  108. {
  109. while(DL_GPIO_readPins(KEY3_PORT_PORT , KEY3_PORT_KEY3_PIN_PIN )==KEY3_PORT_KEY3_PIN_PIN) //一直按下
  110. {
  111. }
  112. a3=a3+4;
  113. if(a3>100)
  114. {
  115. a3=0;
  116. }
  117. }
  118. //第四个按键调第三个阈值
  119. if (DL_GPIO_readPins(KEY4_PORT_PORT ,KEY4_PORT_KEY4_PIN_PIN )==KEY4_PORT_KEY4_PIN_PIN) //按下为高电平
  120. {
  121. while(DL_GPIO_readPins(KEY4_PORT_PORT , KEY4_PORT_KEY4_PIN_PIN )==KEY4_PORT_KEY4_PIN_PIN) //一直按下
  122. {
  123. }
  124. a4=a4+4;
  125. if(a4>=252)
  126. {
  127. a4=0;
  128. }
  129. }
  130. //第五个按键调第四个阈值
  131. if (DL_GPIO_readPins(KEY5_PORT_PORT ,KEY5_PORT_KEY5_PIN_PIN )==KEY5_PORT_KEY5_PIN_PIN) //按下为高电平
  132. {
  133. while(DL_GPIO_readPins(KEY5_PORT_PORT , KEY5_PORT_KEY5_PIN_PIN )==KEY5_PORT_KEY5_PIN_PIN) //一直按下
  134. {
  135. }
  136. a5=a5+4;
  137. if(a5>=252)
  138. {
  139. a5=0;
  140. }
  141. }
  142. //第六个按键调第五 个阈值
  143. if (DL_GPIO_readPins(KEY6_PORT_PORT ,KEY6_PORT_KEY6_PIN_PIN )==KEY6_PORT_KEY6_PIN_PIN) //按下为高电平
  144. {
  145. while(DL_GPIO_readPins(KEY6_PORT_PORT , KEY6_PORT_KEY6_PIN_PIN )==KEY6_PORT_KEY6_PIN_PIN) //一直按下
  146. {
  147. }
  148. a6=a6+4;
  149. if(a6>=252)
  150. {
  151. a6=0;
  152. }
  153. }
  154. //第七个按键调第六个阈值
  155. if (DL_GPIO_readPins(KEY7_PORT_PORT ,KEY7_PORT_KEY7_PIN_PIN )==KEY7_PORT_KEY7_PIN_PIN) //按下为高电平
  156. {
  157. while(DL_GPIO_readPins(KEY7_PORT_PORT , KEY7_PORT_KEY7_PIN_PIN )==KEY7_PORT_KEY7_PIN_PIN) //一直按下
  158. {
  159. }
  160. a7=a7+4;
  161. if(a7>=252)
  162. {
  163. a7=0;
  164. }
  165. }
  166. Serial_TxPacket[0] =a1;
  167. Serial_TxPacket[1] =a2;
  168. Serial_TxPacket[2] =a3;
  169. Serial_TxPacket[3] =a4;
  170. Serial_TxPacket[4] =a5;
  171. Serial_TxPacket[5] =a6;
  172. Serial_TxPacket[6] =a7;
  173. Serial_SendPacket(); //将帧头帧尾和中间的7个数据都发过去
  174. }
  175. }

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/寸_铁/article/detail/920240
推荐阅读
相关标签
  

闽ICP备14008679号