< >
Home » Farmbot开发入门教程 » farmbot开发入门教程-识别植物

farmbot开发入门教程-识别植物

说明:

  • 介绍使用 Plant.ID API 识别您花园中的植物

  • FarmBot 可以将图像上传到第三方 API 以进行进一步处理、存档、机器学习等。在本教程中,我们将演示如何使用以下简化流程将图像从 FarmBot 上传到Plant.ID API:

    • FarmBot 围绕一株植物拍摄六张照片。
    • FarmBot 对图像进行编码并对Plant.ID APIbase64执行 HTTP POST 。
    • Plant.ID 返回一个 JSON 对象,其中包括对图像中哪种植物的猜测。
    • FarmBot 解码 JSON 并格式化发送到 Web 应用程序的用户友好的 toast 通知和日志。

步骤 1:添加您的 Plant.ID 代币

  • 在开始之前,您需要请求一个 Plant.ID API 令牌。

  • 获得令牌后,您必须将其添加到 FarmBot 的自定义设置中。输入PLANT_ID_TOKEN设置名称(密钥)字段,然后将令牌粘贴到值字段中。然后点击按钮。

请输入图片描述

步骤 2:创建序列

  • 导航到序列编辑器并创建新序列。添加一个名为“Plant to ID”的位置变量,并将其设置为您想要识别的植物。

  • Plant.ID 支持园林蔬菜以及杂草和本地植物物种。

请输入图片描述

步骤3:添加Lua代码

  • 在序列中添加一个LUA命令并粘贴以下代码:
plant = variable("Plant to ID")
radius = 40
angle = (math.pi * 2) / 6
offset_x = tonumber(env("CAMERA_CALIBRATION_camera_offset_x") or "0")
offset_y = tonumber(env("CAMERA_CALIBRATION_camera_offset_y") or "0")
token = env("PLANT_ID_TOKEN")
job_name = "Identifying " .. plant.name

-- Check for token
if not token then
  toast("Plant.ID token required", "error")
  return
end

-- Move, then capture and encode image
function capture(num)
    set_job(job_name, {
      percent = (num / 6) * 75,
      status = "Capturing image " .. num
    })
    x = plant.x - offset_x + (radius * math.cos(angle * num))
    y = plant.y - offset_y + (radius * math.sin(angle * num))
    z = 0
    move_absolute(x, y, z)
    data = take_photo_raw()
    return base64.encode(data)
end

-- Capture six images
set_job(job_name)
images = {capture(1), capture(2), capture(3), capture(4), capture(5), capture(6)}

-- Send images to Plant.ID API
set_job(job_name, {
  percent = 90,
  status = "Talking to Plant.ID"
})
headers = {}
headers["Content-Type"] = "application/json"
headers["Api-Key"] = token
body = {
    images = images,
    modifiers = {"health_all", "crops_medium"},
    plant_details = {"common_names"}
}
response, err = http({
    url = "https://api.plant.id/v2/identify",
    method = "POST",
    headers = headers,
    body = json.encode(body)
})

-- Parse common name from Plant.ID response
function common_name(num)
  local suggestions = data["suggestions"][num]
  if suggestions and suggestions["plant_details"] then
    return suggestions["plant_details"]["common_names"][3] or "Unknown"
  end
  return "Unknown"
end

-- Parse probability from Plant.ID response
function probability(num)
  local suggestion = data["suggestions"][num]
  if suggestion then
    return math.floor((suggestion["probability"] or 0) * 100 + 0.5)
  end
  return 0
end

-- Format result
function result(num)
  return common_name(num) .. " (" .. probability(num) .. "%)"
end

-- Display top 3 results
if err then
  toast(inspect(err), "error")
else
  data = json.decode(response.body)
  toast("Possible plants: " .. result(1) .. ", " .. result(2) .. ", " .. result(3))
end

complete_job(job_name)

步骤 4:运行序列

  • 保存序列并等待它与 FarmBot 同步。然后您可以使用“运行”按钮对其进行测试,以确保其按预期运行。

  • 请注意,Lua 代码不会将图像上传到 FarmBot API(它只会将它们上传到 Plant.ID API),因此您不会在 Web 应用程序中看到它们,也不会在以后访问它们。

  • 如果您希望保存图像,可以在移动到下一个位置之前take_photo()向该capture()函数添加命令。这将从同一位置拍摄第二张照片并将其上传到 FarmBot API,同时对第一张图像进行编码并上传到 Plant.ID API。

请输入图片描述

  • 一旦验证该序列有效,您就可以通过多种方式运行它:

    • 通过使用序列编辑器中的RUN按钮。
    • 通过引脚绑定将序列绑定到设备上的物理按钮。
    • 来自父序列内。
    • 按照重复的计划,通过事件。
    • 通过第三方软件,使用FarmBot JS。

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: none