小练习的题目:
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和0imshow("图片", 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;
}
运行结果:
嘿嘿,水了一篇文章。