了解 通道(channels)
一张彩色图片一般由三个通道组成
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{Mat rsv;rsv = imread("C:/Users/Alaso/Desktop/1.jpg");int channels1 = rsv.channels();cout << channels1 << "\n";return 0;
}
了解掩膜操作(AKA 抠图操作)
原理:
掩膜图像就是二进制图像,然后再用原图与掩膜图像进行与运算,最终得到截图
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{Mat src,dd;src = imread("C:/Users/Alaso/Desktop/1.jpg");if (!src.data){cout << "NO Entry" << "\n";return -1;}//namedWindow("Input image",CV_WINDOW_AUTOSIZE);imshow("image", src);dd.create(src.size(),src.type());int iHeight = src.rows;int iwitdth = src.cols;int iChannels = src.channels();for (int i = 0; i < iHeight; i++){for (int j = 0; j < iwitdth; j++){if (iChannels == 1){int iGray = src.at<uchar>(i, j);dd.at<uchar>(i, j) = 255 - iGray;}else{int BB = src.at<Vec3b>(i, j)[0];int GG = src.at<Vec3b>(i, j)[1];int RR = src.at<Vec3b>(i, j)[2];dd.at<Vec3b>(i, j)[0] = 255 - BB;dd.at<Vec3b>(i, j)[0] = 255 - GG;dd.at<Vec3b>(i, j)[0] = 255 - RR;}}}namedWindow("测试输出");imshow("测试输出", dd);waitKey(0);return 0;
}
Mat输入输出矩阵
先零帧起手来一个矩阵
PS:如果矩阵的数据类型不是 CV_8U(即无符号8位整数),imshow 可能无法正确显示内容
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{Mat rsv = (Mat_<int>(3,3)<< 1,2,3,4,5,6,7,8,9);Mat dd = (Mat_<int>(3,3) << 1, 1, 1, 1,1,1,1,1,1);Mat ll = rsv + dd;cout << ll << "\n";ll.convertTo(ll,CV_8U);waitKey(0);return 0;
}
常见图形玩法
点
提要点:点其实就是一个圆心
Point p(3, 4);
cout << p.x << " " << p.y<<"\n";
矩形
提要点:矩形的参数可以是 1.两点 2.一个点+宽和高(point(x,y),width,height)
Rect r1(1, 2, 5, 8);//注意这个前面两个参数是左上角坐标,后面两个参数表示宽和高
cout << r1.x << " " << r1.y << " " << r1.width << " " << r1.height;
通道分离玩法
提要点:若需要将图片大小缩放,需要用resize()函数处理
#include<iostream>
#include<vector>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{Mat src;src = imread("C:/Users/Alaso/Desktop/12.png");if (src.empty()){cout << "No entry" << "\n";return -1;}Mat tiaozhenghoudaxiao;resize(src, tiaozhenghoudaxiao, Size(), 0.5, 0.5, INTER_LINEAR);vector<Mat> dddd;split(tiaozhenghoudaxiao,dddd);Mat BB = dddd.at(0);Mat GG = dddd.at(1);Mat RR = dddd.at(2);imshow("红色", BB);imshow("绿色", GG);imshow("蓝色", RR);waitKey(0);return 0;
}
颜色转换玩法
#include<iostream>
#include<vector>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{Mat src;src = imread("C:/Users/Alaso/Desktop/12.png");if (src.empty()){cout << "No entry" << "\n";return -1;}Mat tiaozhenghoudaxiao,dddd1,dddd2,dddd3;resize(src, tiaozhenghoudaxiao, Size(), 0.5, 0.5, INTER_LINEAR);cvtColor(tiaozhenghoudaxiao,dddd1,COLOR_BGR2GRAY);cvtColor(tiaozhenghoudaxiao, dddd2, COLOR_BGR2HSV);cvtColor(tiaozhenghoudaxiao, dddd3, COLOR_BGR2HLS);imshow("灰度图", dddd1);imshow("HSV图", dddd2);imshow("HLS图", dddd3);waitKey(0);return 0;
}