小练习的题目:
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;
}运行结果:

 嘿嘿,水了一篇文章。
                
                









