环境:
OpenCV – 2.4.13.6
vs2017
win7
#include
#include
#include
using namespace cv;
using namespace std;
int main(){
//VideoCapture capture("video.aiv");//打开指定视频
VideoCapture capture(0);//打开摄像头
if (!capture.isOpened())//没有打开摄像头的话,就返回。
return 1;
Mat img1;
Mat img_binary;
while (true)
{
Mat frame;
capture >> frame;
cvtColor(frame, img1, CV_BGR2GRAY);//将原图转为灰阶图
threshold(img1, img_binary, 100, 255, CV_THRESH_BINARY);//将灰度图转为二值图
putText(frame, "Hello Word!!", Point(40, 60), FONT_HERSHEY_COMPLEX_SMALL, 2, Scalar(125, 125, 225), 1, 8, false);//显示字体在原图中
imshow("原图", frame);
imshow("灰度图", img1);
imshow("二值图", img_binary);
//waitKey(40);//等待40毫秒
if (cvWaitKey(50) == 27){//按esc键退出
cvSaveImage("Image.png", frame, 0);//保存当前屏幕上的图像到本地
break;
}
return 0;
}
图像的二值化就是将图像上的像素点的灰度值设置为0或255,这样将使整个图像呈现出明显的黑白效果。
主要使用方法 threshold ,该方法是通过遍历灰度图中点,将图像信息二值化,处理过后的图片只有二种色值。
原型:
double threshold (InputArray src, OutputArray dst, double thresh, double maxval, int type)
参数信息:
参数 | 含义 |
---|---|
InputArray src | 输入数组,填单通道 , 8或32位浮点类型的Mat即可 |
OutputArray dst | 函数调用后的运算结果存在这里,即这个参数用于存放输出结果,且和第一个参数中的Mat变量有一样的尺寸和类型 |
double thresh | 阈值的最小值 |
double maxval | 当第五个参数阈值类型type取 THRESH_BINARY 或THRESH_BINARY_INV阈值类型时的最大值 |
int type | 阈值类型 |
在OpenCV中利用putText()函数可以在图像上显示文字
原型:
void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false )
参数信息:
参数 | 含义 |
---|---|
Mat& img | 显示文字所在的图像 |
const string& text | 需要显示的文字 |
Point org | 文字显示的位置 |
int fontFace | 字体类型 |
double fontScale | 字体大小(实际大小为fontScale *乘以内置字体大小 ) |
Scalar color | 字体颜色 |
int thickness | 字体的粗细 |
int lineType | 线性 |
bool bottomLeftOrigin | true 图像数据原点在左下角 false 图像数据原点在左上角 |
字体类型 |
---|
FONT_HERSHEY_SIMPLEX |
FONT_HERSHEY_PLAIN |
FONT_HERSHEY_DUPLEX |
FONT_HERSHEY_COMPLEX |
FONT_HERSHEY_TRIPLEX |
FONT_HERSHEY_COMPLEX_SMALL |
FONT_HERSHEY_SCRIPT_SIMPLEX |
FONT_HERSHEY_SCRIPT_COMPLEX |
三通道色彩图像:
uchar b, g, r;
b = frame.at<Vec3b>(i, j)[0];
g = frame.at<Vec3b>(i, j)[1];
r = frame.at<Vec3b>(i, j)[2];
二值化图像:
由于图像经过二值化后,像素就只剩下0与255,所以访问方法有所改变
img_binary.at<uchar>(y, x);
//判断当前点的像素是否为黑色
if(img_binary.at<uchar>(y, x)==0){
//TODO
}