opencv_c++学习笔记day2
Mat对象创建
dst = Mat(src.size(), src.type());//与原图像大小和类型一致
dst = Scalar(255, 0,0);//给不同通道赋灰度值
dst = src.clone();//完全拷贝
src.copyTo(dst);//完全拷贝
Mat M(3, 3, CV_8UC3, Scalar(0, 255, 0));//创建Mat图像并给三个通道赋值 行,列,8位ucharchannel=3,初值
Mat对象使用
部分复制:一般情况下只会复制Mat对象的头和指针部分,不会复制数据部分
Mat B(A);
完全复制:把Mat对象的头部和数据部分一起复制
Mat F=A.clone()
A.copyTo(F);
图像操作
反差色(三通道独立操作)
#include <opencv2/opencv.hpp>
#include<math.h>
#include<iostream>
using namespace cv;
using namespace std;
//反色操作 熟悉图像三通道独立操作
int main(int agrc, char** agrv) {
Mat src,dst;
src = imread("test1.jpg");
if (!src.data) {
printf("Not loading...");
return -1;
}
dst.create(src.size(), src.type());
const int cols = src.cols;
const int rows = src.rows;
int num_channels= src.channels();
for (int row = 0;row < rows;row++) {
for (int col = 0;col < cols;col++) {
if (num_channels == 1) {
int gray = src.at<uchar>(row, col);
dst.at <uchar>(row,col)= 255 - gray;
}
else if (num_channels == 3) {
int b = src.at<Vec3b>(row, col)[0];
int g = src.at<Vec3b>(row, col)[1];
int r = src.at<Vec3b>(row, col)[2];
dst.at<Vec3b>(row, col)[0] = 255 - b;
dst.at<Vec3b>(row, col)[1] = 255 - g;
dst.at<Vec3b>(row, col)[2] = 255 - r;
}
}
}
imshow("inverse_src", dst);
waitKey(0);
return 0;
}
也可以直接用函数
bitwise_not(src, dst);//颜色反转
读写像素
读一个GRAY像素点的像素值8UC1
Scalar intensity=img.at(y,x);//此时为标量
读一个RGB像素点的像素值
Vec3f intensity =img.at(y,x);//此时为向量
float b=intesity.val[0];
Vec3b与Vec3f
Vec3b对应8U(0-255uchar型)
Vec3f对应32F(0-1float型)
转换数据类型可以用
src.convertTo(dst,type);