文档章节

processing视觉抓取

YANG_G
 YANG_G
发布于 2017/08/28 11:20
字数 1071
阅读 48
收藏 1
点赞 0
评论 0

接之前的scara机械臂,我用processing写了一个简单的视觉抓取小程序:识别红蓝绿色块并顺序抓放。

import processing.serial.*;
import processing.video.*;

Serial Port;
Capture cam;
float[][] kernel ={{0.111,0.111,0.111},
                   {0.111,0.111,0.111},
                   {0.111,0.111,0.111}
                   };//卷积核
//中间像素的灰度值等于周围像素的红色分量减去蓝绿色分量的平均值
//从而使没有红色特征的像素灰度值变为零
//相当于滤镜的效果,修改卷积核的参数,可以达到不一样的效果
int sub_x=0,sub_y=0;//物体中心的像素坐标
float pre_x=0,pre_y=0;//前一帧物体中心的像素坐标
float tar_x=80,tar_y=80;//目标坐标,机械手的坐标
boolean event=false;//坐标计算事件
int c=0;


void setup()//初始化
{
  String portName = Serial.list()[0];
  Port = new Serial(this, portName, 115200);//连接串口
  size(640,480);//屏幕大小
  String[] cameras = Capture.list();
  printArray(cameras);//打印可使用的相机
  cam = new Capture(this, cameras[0]);
  cam.start();//启动相机
  frameRate(30);//帧率
  Port.write("G5 B90\r\n");
  Port.write("G28\r\n");
  Port.write("G1 X80 Y80 Z40\r\n");
  Port.write("G5 B50\r\n");//移动到初始位置
  delay(6000);//延迟,避免摄像头刚打开时的波动
}

void draw()//循环
{
  if (cam.available() == true)
  {
    cam.read();
    image(cam, 0, 0, width, height);
    cam.loadPixels();
    int sum_x=0,sum_y=0;//所有红色像素坐标的和
    int m=1;//红色像素的个数
    for(int y=1;y<cam.height-1;y++)//排除第一行、最后一行、第一列、最后一列像素(这几个地方周围的像素不完整)
    {
      for(int x=1;x<cam.width-1;x++)//经过所有像素
      {
        float sum=0;//最终的灰度值
        for(int ky =-1;ky<=1;ky++)
        {
          for(int kx=-1;kx<=1;kx++)//周围9个像素(包括自身)
          {
          int pos =(y+ky)*cam.width+(x+kx);//将xy坐标换算成pixels[]数组中的位置,pixels[]数组是可以直接调用的储存像素的一维数组(从左到右从上到下)
          int R = (cam.pixels[pos]>> 16) & 0xFF; //取颜色分量,与red()功能相似
          int G = (cam.pixels[pos] >> 8) & 0xFF;
          int B = cam.pixels[pos] & 0xFF;
          float val=0;
          switch(c)//顺序抓取红蓝绿色块
          {
            case 0:
              val =R-1.5*B-1.5*G;
              break;
            case 1:
              val =B-1.5*R-1.5*G;
              break;
            case 2:
              val =G-0.5*B-1*R;
              break;
          }
             //1.5为比例系数,改大可以让红色更突出
          sum +=kernel[ky+1][kx+1]*val;//计算灰度值
          }
        }
        if(sum>0)//新的灰度值非零
        {
          sum_x=sum_x+x;
          sum_y=sum_y+y;//累加坐标
          m=m+1;//计数
        }
       }
     }
   pre_x=sub_x;
   pre_y=sub_y;//前一帧的物体中心
   sub_x=sum_x/m;
   sub_y=sum_y/m;//取平均,计算出物体中心像素坐标
   
   cam.updatePixels();

    fill(#FF0000);
  }
  line(sub_x,0,sub_x,480);
  line(0,sub_y,640,sub_y);//作物体中心的两条交叉线

  if(abs(sub_x-pre_x)<5&&abs(sub_y-pre_y)<5&&sub_x>5&&sub_y>5)//判断是否在移动(波动小于5个像素即为静止),是否存在物体(没有物体时默认为0,为避免波动,这里设置成5)
  {
    if(event==true)//如果物体存在,机械手静止,且事件被触发,则进行计算
    {
     tar_x=tar_x-(0.0625*sub_x-20);
     tar_y=tar_y-(15-0.0625*sub_y);//把像素坐标转化成绝对坐标,根据实际比例
     event=false;//关闭计算事件,即只执行一次计算
     Port.write("G1 X"+tar_x+" Y"+tar_y+"\r\n");//移动到目标位置
     delay(100);//延迟,减小波动
    }
  }
  else //如果机械手在移动,触发计算事件,但不执行计算,为机械手静止时计算做准备
   event=true;
    /*由于机械手的通讯以及动作上有延迟,速度远赶不上摄像头对图像识别的速度,
    所以仅让机械臂在静止时进行一次计算*/
  if(sub_x<5&&sub_y<5)
  {
    if(c<3)
      c=c+1;
     else
       c=0;
  }
  float mx=tar_x;
  float my=tar_y+32;//手抓中心对的坐标,摄像头和手抓有32的y偏移量
  if(sub_x>315&&sub_x<325&&sub_y>235&&sub_y<245)//当物体在画面中心时(+-5个像素)
  { 
     //执行以下动作
     Port.write("G1 X"+mx+'Y'+my+"Z12 F1200\r\n");
     delay(1500);//充分延时
     for(int i=50;i<=150;i+=5)
     {
       Port.write("G5 B"+i+"\r\n");
       delay(50);
     }
     
     delay(500);
     Port.write("G1 Z30\r\n");
     delay(1000);
     switch(c)//顺序摆放红蓝绿色块
     {
       case 0:
         Port.write("G1 X150 Y120\r\n");break;
       case 1:
         Port.write("G1 X150 Y100\r\n");break;
       case 2:
         Port.write("G1 X150 Y80\r\n");break;
     }
     delay(1500);
     Port.write("G1 Z10\r\n");
     delay(500);
     for(int j=150;j>=50;j-=5)
     {
       Port.write("G5 B"+j+"\r\n");
       delay(50);
     }
     delay(500);
     Port.write("G1 X80 Y80 Z40\r\n");
     delay(1500);
    if(c<3)
      c=c+1;
     else
       c=0;
   }
  
  println(tar_x);
  println(tar_y);
}

 

© 著作权归作者所有

共有 人打赏支持
YANG_G
粉丝 3
博文 4
码字总数 10801
作品 0
福州
Processing 2.0 发布,开源图形处理编程语言

用于创意艺术和视觉设计的开源编程语言和开发环境Processing发布了2.0版(代码托管在Github) ,主要新特性是用 OpenGL加速的渲染器替代基于软件的渲染器。 Processing项目诞生于2001年,其发...

oschina ⋅ 2013/06/06 ⋅ 2

图像处理框架语言--Processing

Processing是一种具有革命前瞻性的新兴计算机语言,为图像处理提供开源编程语言和环境,动画和互动。这是使用的学生,艺术家,设计师,研究人员和爱好者学习,原型及生产。这是建立基础教育计...

匿名 ⋅ 2009/06/01 ⋅ 0

朗锐智科工业智能相机在机器人视觉引导中的应

自2010年以来,机器人的需求量一直在迅速增长,这是由于机器人技术不断提高,越来越多的制造商采用和实施自动化。中国制造业面临着向高端转变,承接国际先进制造、进一步要求工业机器人向着智...

gunser ⋅ 04/04 ⋅ 0

DotNetWikiBot 框架发布 2.9 版本

DotNetWikiBot Framework 是一个全功能的客户端API和一个控制台应用,用来构建抓取基于 MediaWiki 网站的爬虫,采用 .NET 开发。 Changes: 1. Critical updates were made to the Login() fu...

红薯 ⋅ 2010/04/10 ⋅ 0

图像采集库和算法--Camunits

Camunits 包含 图像采集库,算法, 和为机器视觉研究者设计的工具. Camunits 用C 语言写成并且用了 GLib 库. Camunits 分成以下几个部分 libcamunits Provides the core functionality of Cam...

匿名 ⋅ 2011/06/10 ⋅ 0

PMD 5.8.1 发布,Java 程序代码检查工具

PMD 5.8.1 已发布,这是一个小更新的版本。PMD 是一款采用 BSD 协议发布的 Java 程序代码检查工具。该工具可以做到检查 Java 代码中是否含有未使用的变量、是否含有空的抓取块、是否含有不必...

王练 ⋅ 2017/07/02 ⋅ 0

[IBM DW] 利用 Heritrix 构建特定站点爬虫

Heritrix 是一个由 java 开发的、开源的网络爬虫,用户可以使用它来从网上抓取想要的资源。其最出色之处在于它良好的可扩展性,方便用户实现自己的抓取逻辑。本文详细介绍了 Heritrix 在 Ec...

红薯 ⋅ 2010/12/02 ⋅ 2

AForge.NET

AForge.NET - 是一个为科研人员提供的计算机视觉和人工智能的 C# 框架。The framework summarizes most of my previous work being done in these areas and is going to be extended more ......

匿名 ⋅ 2010/05/01 ⋅ 0

协作机器人研讨会 总结

以下内容为八月6,7日组织召开的广州协作机器人-前沿与挑战研讨会的技术总结,以及相应的可以转化的项目介绍与未来市场预期,仅供参考。我们将会从末端执行器,传感器,机器人软件,安全性与...

李淼robot ⋅ 2016/08/21 ⋅ 0

人工智能产业升温机器视觉成数据采集最佳工具

根据市场研究报告,2015年全球机器视觉市场规模为80.8亿美元,到2020年市场规模将达125亿美元,其中,2015年中国机器视觉市场规模61.2亿元,到2020年市场规模将达152亿元,同比增速为28.57%。...

gunser ⋅ 06/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

用ZBLOG2.3博客写读书笔记网站能创造今日头条的辉煌吗?

最近两年,著名的自媒体网站今日头条可以说是火得一塌糊涂,虽然从目前来看也遇到了一点瓶颈,毕竟发展到了一定的规模,继续增长就更加难了,但如今的今日头条规模和流量已经非常大了。 我们...

原创小博客 ⋅ 今天 ⋅ 0

MyBatis四大核心概念

本文讲解 MyBatis 四大核心概念(SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession、Mapper)。 MyBatis 作为互联网数据库映射工具界的“上古神器”,训有四大“神兽”,谓之:Sql...

waylau ⋅ 今天 ⋅ 0

以太坊java开发包web3j简介

web3j(org.web3j)是Java版本的以太坊JSON RPC接口协议封装实现,如果需要将你的Java应用或安卓应用接入以太坊,或者希望用java开发一个钱包应用,那么用web3j就对了。 web3j的功能相当完整...

汇智网教程 ⋅ 今天 ⋅ 0

2个线程交替打印100以内的数字

重点提示: 线程的本质上只是一个壳子,真正的逻辑其实在“竞态条件”中。 举个例子,比如本题中的打印,那么在竞态条件中,我只需要一个方法即可; 假如我的需求是2个线程,一个+1,一个-1,...

Germmy ⋅ 今天 ⋅ 0

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。 实现之前先过过 redis 发布订阅的一些基础概念和操...

Simonton ⋅ 今天 ⋅ 0

error:Could not find gradle

一.更新Android Studio后打开Project,报如下错误: Error: Could not find com.android.tools.build:gradle:2.2.1. Searched in the following locations: file:/D:/software/android/andro......

Yao--靠自己 ⋅ 昨天 ⋅ 0

Spring boot 项目打包及引入本地jar包

Spring Boot 项目打包以及引入本地Jar包 [TOC] 上篇文章提到 Maven 项目添加本地jar包的三种方式 ,本篇文章记录下在实际项目中的应用。 spring boot 打包方式 我们知道,传统应用可以将程序...

Os_yxguang ⋅ 昨天 ⋅ 0

常见数据结构(二)-树(二叉树,红黑树,B树)

本文介绍数据结构中几种常见的树:二分查找树,2-3树,红黑树,B树 写在前面 本文所有图片均截图自coursera上普林斯顿的课程《Algorithms, Part I》中的Slides 相关命题的证明可参考《算法(第...

浮躁的码农 ⋅ 昨天 ⋅ 0

android -------- 混淆打包报错 (warning - InnerClass ...)

最近做Android混淆打包遇到一些问题,Android Sdutio 3.1 版本打包的 错误如下: Android studio warning - InnerClass annotations are missing corresponding EnclosingMember annotation......

切切歆语 ⋅ 昨天 ⋅ 0

eclipse酷炫大法之设置主题、皮肤

eclipse酷炫大法 目前两款不错的eclipse 1.系统设置 Window->Preferences->General->Appearance 2.Eclipse Marketplace下载【推荐】 Help->Eclipse Marketplace->搜索‘theme’进行安装 比如......

anlve ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部