小练习的题目:
1、读取一张图,分解RGB三个通道
/************练习1**********************/
int main()
{
Mat img1 = imread("D:\\opencv_picture_test\\miku2.jpg",2|4); //灰度图
if (img1.empty())
{
printf("Could not find the image!\n");
return -1;
}
std::vector<cv::Mat> channels;
cv::split(img1,channels);
Mat B = channels.at(0);
Mat G = channels.at(1);
Mat R = channels.at(2);
imshow("blue", B);
imshow("green", G);
imshow("red", R);
waitKey(0);
return 0;
}
2、调用本机摄像头
/************练习2**********************/
int main()
{
//实例化的同时初始化
//调用摄像头
VideoCapture capture(0); //类似于 int a=1;
/*
先实例化
VideoCapture capture;
再初始化
capture.open("D:\\opencv_picture_test\\video1.avi");
*/
while (1)
{
Mat frame; //存储每一帧的图像
capture >> frame; //读取当前帧
imshow("原视频", frame); //显示当前帧
//进行腐蚀操作
Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //返回的是内核矩阵
Mat dstImage;
erode(frame, dstImage, element); //腐蚀操作
imshow("处理后的视频", dstImage); //显示当前帧
if(waitKey(10) >= 0) break; //延时10ms
}
return 0;
}
3、opencv基本绘图功能
int main()
{
Mat displayMat = imread("D:\\opencv_picture_test\\RGB纯色图\\blue.jpg", 0); //灰度图
if (displayMat.empty())
{
printf("Could not find the image!\n");
return -1;
}
//画圆
Point pt; //圆心
pt.x = 90;
pt.y = 90;
circle(displayMat, pt, 20, CV_RGB(0, 255, 0), 1, 8, 0); //画圆的目标图像 圆心的点 圆的半径 圆的颜色
// 圆的线条粗细,取-1为绘制实心圆 领接关系和偏移,一般设置默认值,8和0
//画线段
Point pt1; //起点
pt1.x = 100;
pt1.y = 100;
Point pt2; //终点
pt2.x = 300;
pt2.y = 300;
line(displayMat, pt1, pt2, CV_RGB(0, 255, 0), 10, 8, 0);
//目标图像 起点 终点
// 线条粗细, 领接关系和偏移,一般设置默认值,8和0
//画矩形框
Rect rect;
rect.x = 20;
rect.y = 20;
rect.width = 20;
rect.height = 20;
rectangle(displayMat, rect, CV_RGB(0, 255, 0), 1, 8, 0);
//的目标图像 目标矩形
// 线条粗细,取-1为绘制实心矩形 领接关系和偏移,一般设置默认值,8和0
imshow("图片", displayMat);
waitKey(0);
return 0;
}
运行效果
4、构建一个直方图
///*--------------------------【练习4】绘制一维灰度直方图-------------------------------------*/
Mat My_Rraw_histogram(Mat* srcImage) //输入:要处理的灰度图 输出:该图像的直方图
{
//【2】定义变量
MatND dstHist;
int dims = 1; //需要计算的直方图的维数
float grayranges[] = { 0,255 };
const float* ranges[] = { grayranges }; //这里需要为const类型
int size = 256; //表示的是将统计的灰度值分成的等份
int channels = 0; //灰度图只有一个0通道
//【3】计算图像直方图
calcHist(srcImage, //输入数组
1, //数组个数
&channels, //通道索引
Mat(),//不使用掩膜
dstHist, //输出的目标直方图
dims, //需要计算的直方图的维数
&size, //存放每个维度的直方图尺寸的数组
ranges); //每一维数值的取值范围
int scale = 1; //scale 每一个像素占的格数
Mat dstImage(size * scale, size, CV_8U, Scalar(0)); //长 :size*scale ,宽:size ,值为0
//【4】获取最大值和最小值
double minVal = 0;
double maxVal = 0;
minMaxLoc(dstHist, &minVal, &maxVal, 0, 0); //获得直方图中最大值和最小值
//【5】绘制出直方图
int hpt = saturate_cast<int>(0.9 * size); //saturate_cast 是溢出保护 大概意思 :if(data<0) data = 0; else if (data > 255) data = 255;
for (int i = 0;i < 256;i++)
{
float binVal = dstHist.at<float>(i);
int realVal = saturate_cast<int>(binVal * hpt / maxVal); //在图像上的高度 = 像素值/最大像素值 * 0.9*256 这里0.9是为了削减图像像素高度,因为最大的时候会触及顶端不美观
rectangle(dstImage, Point(i * scale, size - 1), Point((i + 1) * scale - 1, size - realVal), Scalar(255));
//要进行绘制的目标图像 矩形的左下顶点 矩阵对角线上的右上顶点 线条的颜色(RGB)或亮度(灰度图) 一共要绘制256个矩形
}
return dstImage;
}
//主函数
int main()
{
//【1】载入原图
Mat srcImage = imread("D:\\opencv_picture_test\\新垣结衣\\test2.jpg", 0); //原图的灰度图
namedWindow("灰度图", WINDOW_NORMAL);//WINDOW_NORMAL允许用户自由伸缩窗口
imshow("灰度图", srcImage);
if (srcImage.empty())
{
printf("Could not find the image!\n");
return -1;
}
Mat dstImage = My_Rraw_histogram(&srcImage);
namedWindow("一维直方图", WINDOW_NORMAL);//WINDOW_NORMAL允许用户自由伸缩窗口
imshow("一维直方图", dstImage);
waitKey(0);
return 0;
}
运行结果:
嘿嘿,水了一篇文章。