串口通信,opencv3.0
窗口大小可调

编译
cmake ../
make
./color
正常光线下运行比较稳定,找圆比较准确。程序设置了圆的半径区间以及圆心最小间距,以满足产品的需求,可自行修改调试。

历程如下

#define USE_SERIAL 0 // 1:use serial  0:not use serial    //用串口调试时置1,不用串口时一定要置0,否则会报错

#include <iostream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <opencv2/core/core.hpp>  
#include <opencv2/opencv.hpp>


#if USE_SERIAL
#include <boost/asio.hpp>
#include <boost/bind.hpp>
using namespace boost::asio;

#endif


using namespace cv;
using namespace std;

int g_nThresh = 135;
Mat canny_output;
Mat imgOriginal;
Mat imgHSV;
Mat imgThresholded;//二值化后的图像数组
Mat bf;//对灰度图像进行双边滤波
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
Mat dstImage;
int x,y,r;
int iLowH = 9;
int iHighH = 37;
int iLowS = 135;
int iHighS = 255;
int iLowV = 175;
int iHighV = 255;

int main(int argc, char** argv)
{
size_t i = 0;
int fd;
#if USE_SERIAL
char serial_buff[100]={0};
io_service iosev;
        //节点文件
/* fd = open("/dev/ttyUSB0",O_RDWR);
if( -1 == fd );
{
cout << "Error: Cannot open the serial port" << endl;
cout << endl;
return -1;
}
close(fd);
*/
        serial_port serial(iosev, "/dev/ttyUSB0");

        // 设置参数
        serial.set_option(serial_port::baud_rate(115200));
        serial.set_option(serial_port::flow_control(serial_port::flow_control::none));
        serial.set_option(serial_port::parity(serial_port::parity::none));
        serial.set_option(serial_port::stop_bits(serial_port::stop_bits::one));
        serial.set_option(serial_port::character_size(8));
//write(serial, buffer("Test!\r\n", sizeof("Test!\r\n")));
#endif

VideoCapture cap(-1); //capture the video from web cam

if (!cap.isOpened())  // if not success, exit program
{
cout << "Error: Cannot open the web cam" << endl;
cout << endl;
return -1;
}
#if USE_SERIAL
write(serial, buffer("Test!\r\n", sizeof("Test!\r\n")));
#endif

// namedWindow("imgThresholded", 0);    //Image can adjust size

while (true)
{

bool bSuccess = cap.read(imgOriginal); // read a new frame from video

if (!bSuccess) //if not success, break loop
{
cout << "Cannot read a frame from video stream" << endl;
break;
}
//区分颜色*****************************************************************************************************
vector<Mat> hsvSplit;//cevtor 容器
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV

 //因为我们读取的是彩色图,直方图均衡化需要在HSV空间做
split(imgHSV, hsvSplit);//(多通道数组-》容器)
equalizeHist(hsvSplit[2], hsvSplit[2]);
merge(hsvSplit, imgHSV);

inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image

 //开操作 (去除一些噪点)
morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);

//闭操作 (连接一些连通域)
morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);

//addWeighted(imgThresholded, 1, canny_output, 1, 0., dstImage);
//morphologyEx(dstImage, dstImage, MORPH_CLOSE, element);

//找圆************************************************************************************************************

blur(imgThresholded, bf, Size(3, 3));
//用Canny算子检测边缘
Canny(bf, canny_output, g_nThresh, g_nThresh * 2, 3);

vector<Vec3f> circles;//声明一个向量,保存检测出的圆的圆心坐标和半径
HoughCircles(canny_output, circles, CV_HOUGH_GRADIENT, 1, 70, 250, 10, 5, 70);//霍夫变换检测圆1.5, 5, 150, 80, 1, 50

for ( i = 0; i < circles.size(); i++)//把霍夫变换检测出的圆画出来
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);

circle(imgOriginal, center, radius, Scalar(255, 255, 255), 3,8, 0);

// cout << "x="<<cvRound(circles[i][0]) << "\t" << "y="<< cvRound(circles[i][1]) << "\t"
// << "z="<< cvRound(circles[i][2]) << endl;//在控制台输出圆心坐标和半径
x=cvRound(circles[i][0]);
y=cvRound(circles[i][1]);
r=cvRound(circles[i][2]);
#if USE_SERIAL
sprintf( serial_buff,"A%03d%03d%03d%03dB",i,cvRound(circles[i][0])/8,cvRound(circles[i][1])/8,cvRound(circles[i][2]));
write(serial, buffer(serial_buff, 14 ));
//write(serial, buffer("AB", 2));

#endif
}
#if USE_SERIAL
if( i!=0 )
write(serial, buffer("\r\n", strlen("\r\n")));
#endif

//~~~~~~~~~~~~~~~~~~~~~~~~
imshow("imgThresholded", imgThresholded);//滤过颜色
cvResizeWindow("imgThresholded",640,480);//Image can adjust size
imshow("imgOriginal", imgOriginal);//寻找边沿
cvResizeWindow("imgOriginal",640,480);//Image can adjust size
//imshow("canny_output", canny_output);//原图显示找出的圆

char key = (char)waitKey(20);
if (key == 27)
break;
}

return 0;

}

基于ubuntu14视觉识别乒乓球_1的更多相关文章

  1. 基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记

    基于Ubuntu14.04系统的nvidia tesla K40驱动和cuda 7.5安装笔记 飞翔的蜘蛛人 注1:本人新手,文章中不准确的地方,欢迎批评指正 注2:知识储备应达到Linux入门级水平 ...

  2. 基于Ubuntu14.04下Suricata(一款高性能的网络IDS、IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐)

    为什么,要写这篇论文? 是因为,目前科研的我,正值研三,致力于网络安全.大数据.机器学习研究领域! 论文方向的需要,同时不局限于真实物理环境机器实验室的攻防环境.也不局限于真实物理机器环境实验室的大数 ...

  3. WordPress博客平台的搭建--基于Ubuntu14服务器

    环境:阿里云服务器,系统Ubuntu14.04, 阿里云域名 大致流程:LNMP+WordPress 主要参考博客:VPS+LNMP+WordPress搭建个人网站/博客 遇到的问题: 1.在登陆域名 ...

  4. 基于Ubuntu14.04-LTS下安装docker

    1.sudo apt-get update --更新系统源 2.sudo apt-get install docker.io 3.将docker库的公钥中加入到本地apt中 sudo apt-key ...

  5. 全网最详细的基于Ubuntu14.04/16.04 + Anaconda2 / Anaconda3 + Python2.7/3.4/3.5/3.6安装Tensorflow详细步骤(图文)(博主推荐)

    不多说,直接上干货! 前言 建议参照最新的tensorflow安装步骤(Linux,官方网站经常访问不是很稳定,所以给了一个github的地址):         https://github.com ...

  6. Disconf 学习系列之全网最详细的最新稳定Disconf 搭建部署(基于Ubuntu14.04 / 16.04)(图文详解)

    不多说直接上干货! https://www.cnblogs.com/wuxiaofeng/p/6882596.html (ubuntu16.04) https://www.cnblogs.com/he ...

  7. 基于Ubuntu14.10的Hadoop+HBase环境搭建

    本篇博文中谈及的Hadoop和HBase都是单机版,简单了解. 首先在Ubuntu上搭建Hadoop开发环境,主要参考另外一篇博客,仔细照做并解决出现的问题即可. 地址:http://www.powe ...

  8. 基于CentOS6.5或Ubuntu14.04下Suricata里搭配安装 ELK (elasticsearch, logstash, kibana)(图文详解)

    前期博客 基于CentOS6.5下Suricata(一款高性能的网络IDS.IPS和网络安全监控引擎)的搭建(图文详解)(博主推荐) 基于Ubuntu14.04下Suricata(一款高性能的网络ID ...

  9. 搭建ubuntu14.04的hadoop集群【docker容器充当服务器】

    首先弄出来装有hadoop.java.ssh.vim的镜像起名badboyf/hadoop.做镜像有两种方法,一种是用Dockerfile来生成一个镜像,一种是基于ubuntu14.04的基础镜像生成 ...

随机推荐

  1. Java 基础 break和continue关键字的使用

    break&continue关键字的使用 break:使用在switch...case语句或者循环结构语句中,表示结束当前循环. 示例代码: public class TestBreak { ...

  2. 马踏棋盘算法递归+回溯法实现 C语言

    r为矩阵的行,c为矩阵的列 将结果输出到当前目录下的results.txt. 结果将给出:1.是否存在路径使马可以按要求走遍所有的方格: 2.解的总数: 3.程序执行的时间: #include< ...

  3. 耍一把codegen,这样算懂编译么?

    最近使用protobuf搭了些服务器,对protobuf的机制略感兴趣,所以研究了下. 大致分析没有什么复杂的 1 对定义的结构体生成消息封包协议 2 对定义的rpc函数生成接口定义 3 用户按pro ...

  4. [leetcode-611-Valid Triangle Number]

    Given an array consists of non-negative integers, your task is to count the number of triplets chose ...

  5. Spring MVC 项目搭建 -1- 创建项目

    Spring MVC 项目搭建 -1- 创建项目 1.创建 Dynamic Web project (SpringDemo),添加相关jar包 2.创建一个简单的controller类 package ...

  6. JFile的导入xlsx与xls

    首先需要有JAVA的一些jar包 下载地址:http://download.csdn.net/detail/qq_35980546/9892511 你要先配置好路由,还有能拿到绝对路径才行 下面直接给 ...

  7. JSP include HTML出现乱码 问题解决

    Problem? 当使用<jsp:include page="top.html"></jsp:include>引入html文件时, 并且jsp 和 html ...

  8. Python爬虫从入门到放弃(十八)之 Scrapy爬取所有知乎用户信息(上)

    爬取的思路 首先我们应该找到一个账号,这个账号被关注的人和关注的人都相对比较多的,就是下图中金字塔顶端的人,然后通过爬取这个账号的信息后,再爬取他关注的人和被关注的人的账号信息,然后爬取被关注人的账号 ...

  9. Extjs4+PHP MVC模式一(入门)

    Extjs是一个js框架,可以实现大部分web页面的东西,个人理解是一款集html.css.js一体的框架,功能挺强大的.结合PHP和sql可以实现整个系统.现在来说说怎么用它.(我的项目是用的TP框 ...

  10. Java并发编程笔记——技术点汇总

    目录 · 线程安全 · 线程安全的实现方法 · 互斥同步 · 非阻塞同步 · 无同步 · volatile关键字 · 线程间通信 · Object.wait()方法 · Object.notify() ...