做opencv最基础的就是利用摄像头进行实时图像处理。这在后面会有许多的用处。
例如一段简单的开启摄像头的代码:
#include "stdafx.h"
#include
#include
#include
int main( int argc, char** argv )
{
//声明IplImage指针
IplImage* pFrame = NULL;
//获取摄像头
CvCapture* pCapture = cvCreateCameraCapture(1);
//创建窗口
cvNamedWindow("video", 1);
//显示视屏
while(1)
{
pFrame=cvQueryFrame( pCapture );
if(!pFrame)break;
cvShowImage("video",pFrame);
char c=cvWaitKey(33);
if(c==27)break;
}
cvReleaseCapture(&pCapture);
cvDestroyWindow("video");
}
在其中很重要的是 CvCapture* pCapture = cvCreateCameraCapture(1);一般情况下cvCreateCameraCapture()中传入的为0,表示电脑自带摄像头,还有的是1表示USB摄像头,当然还有-1-,OpenCV会打开一个窗口让用户选择需要使用的摄像机。
霍夫曼圆是opencv库中一个检测圆形的小函数在条件良好的情况下,几乎可以检测所有的圆形。
这段代码就是霍夫曼圆的示例:
#include
#include
using namespace cv;
int main()
{
//开起摄像头
VideoCapture capture;
capture.open(1);
Mat edges; //定义转化的灰度图
if (!capture.isOpened())
return -1;
namedWindow("效果图", CV_WINDOW_NORMAL);
while (1)
{
Mat frame;
capture >> frame;
if (!frame.data)
return -1;
cvtColor(frame, edges, CV_BGR2GRAY);
//高斯滤波
GaussianBlur(edges, edges, Size(7, 7), 2, 2);
vector circles;
//霍夫圆
HoughCircles(edges, circles, CV_HOUGH_GRADIENT, 1.5, 10, 200, 100, 0, 0);
for (size_t i = 0; i < circles.size(); i++)
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
//绘制圆心
circle(frame, center, 3, Scalar(0, 255, 0), -1, 8, 0);
//绘制圆轮廓
circle(frame, center, radius, Scalar(155, 50, 255), 3, 8, 0);
}
imshow("效果图", frame);
waitKey(30);
}
return 0;
}
opencv的学习很丰富很好玩!
二次编辑(2017、9、16)
因工作需要,写了一个可以找多个圆的相似程序,一起发上来了,其中注释掉了一些窗口
#include "stdafx.h"
#include
#include
using namespace cv;
using namespace std;
const int kvalue = 15;//双边滤波邻域大小
int main()
{
VideoCapture capture;
capture.open(0);
wihle(1)
{
if(!capture.isOpened()) return -1;
namedWindow("xiaoguotu",CV_WINDOW_NORMAL);
Mat frame;//shipinliu
capture>>frame;
if(!frame.data)return -1;
//声明一个三通道图像,像素值全为0,用来将霍夫变换检测出的圆画在上面
Mat dst(frame.size(), frame.type());
dst = Scalar::all(0);
Mat edges;//彩色图像转化成灰度图
cvtColor(frame, edges, COLOR_BGR2GRAY);
Mat bf;//对灰度图像进行双边滤波
bilateralFilter(edges, bf, kvalue, kvalue*2, kvalue/2);
//声明一个向量,保存检测出的圆的圆心坐标和半径
vector circles;
//霍夫变换检测圆
HoughCircles(bf, circles, CV_HOUGH_GRADIENT, 1.5, 20, 130, 38, 10, 50);
cout << "x=\ty=\tr=" << endl;
for(size_t i = 0; i < circles.size(); i++)//把霍夫变换检测出的圆画出来
{
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
//在dst绘制圆心
circle( dst, center, 0, Scalar(0, 255, 0), -1, 8, 0 );
//在dst绘制圆 ,dst可更换为frame或者edges
circle( dst, center, radius, Scalar(0, 0, 255), 1, 8, 0 );
cout << cvRound(circles[i][0]) << "\t" << cvRound(circles[i][1]) << "\t"
<< cvRound(circles[i][2]) << endl;//在控制台输出圆心坐标和半径
}
}
imshow("三通道", dst);
//imshow("正常图像", frame);
//imshow("灰度化", edges);
waitKey(30);
}
具体效果如下图:
你以为我会告诉你,我的圆点图是用WORD画的,天真!!!!!!!!!