今天在家无聊,终于有时间写下我的第一篇CSDN博客啦,前段时间帮一个老师做一个项目,用摄像头检测地上的色带,输出角度帮助机器人寻迹。就想到用opencv来做,可以我不会啊,怎么办?看呗。这里对opencv点个赞!函数通俗易懂,环境配置也比较简单,英语阅读能力好的人都不用买书的,看文档就可以用得飞起啊~~
看了几天就把程序写好了,用得不好大家不喜勿碰,思路如下:
程序如下:
// camera.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include "stdio.h"
#include "findtape.h"
using namespace cv;
using namespace std;
int minVotenum=50;
int _tmain(int argc, _TCHAR* argv[])
{
VideoCapture cap0(0);//打开一个摄像头
VideoCapture cap1(1);//打开一个摄像头 笔记本必须要两个,否则打不开外置摄像头
vector<Vec4i> lines,resultlines;//存储视频中直线的起点和终点
Mat source_frame,source_frame1,gray_frame;//新建两帧图像
int frame_width,frame_height;
namedWindow("视频",WINDOW_AUTOSIZE);//新建一个图像窗口
if(!cap0.isOpened()) //判断是否打开
{
cerr<<"Can not open a camera or file."<<endl;
return -1;
}
//获取视频的宽和高
frame_height=(int)cap0.get(CV_CAP_PROP_FRAME_HEIGHT);
frame_width=(int)cap0.get(CV_CAP_PROP_FRAME_WIDTH);
//namedWindow("灰度视频",WINDOW_AUTOSIZE);//新建一个图像窗口
bool stop = false;
while(!stop)
{
cap0>>source_frame;//从视频一副图片
cap1>>source_frame1;//从视频一副图片 这句没用的,为了打开外置摄像头而已
cvtColor(source_frame, gray_frame, CV_BGR2GRAY);//转换成灰度图像
GaussianBlur(gray_frame, gray_frame, Size(7,7), 1.5, 1.5,BORDER_DEFAULT); //高斯滤波
Canny(gray_frame, gray_frame, 50, 150, 3); //边缘检测 内部用到sobel计算梯度 可以调整阈值 想想怎么弄成自动阈值
//Hough变换
//检测直线,最小投票为50,线条不短于50,间隙不小于20
HoughLinesP( gray_frame, lines,1,CV_PI/360,minVotenum,50,20);
//找出目标直线 并计算角度 距离