#include<opencv.hpp>
#include <iostream>
using namespace cv;
int main()
{
//新建一个100 * 100 的图像,CV_8UC3:类型为8位无符号,通道数为3,分别是蓝绿红通道,
//颜色bgr为255,0,0,蓝通道0xff(8位图像最大位0xFF) ,绿红为0
cv::Mat blue = cv::Mat(100, 100, CV_8UC3, cv::Scalar(255, 0, 0));
//新建一个窗口,标题为title
cv::namedWindow("title", cv::WINDOW_KEEPRATIO);
//往标题为title的窗口中填充图像,若无此窗口,则自动创建
cv::imshow("title", blue);
//读文件 注意反斜杠方向
cv::Mat src = imread("C:/Users/FeboReigns/Desktop/CachedImage_1024_768_POS4.jpg");
//打印基本信息 大小 通道数 类型,注意类型是宏定义,要去查数字对应是哪个类型
// 这是宏定义 我复制过来了一部分
//#define CV_8U 0
//#define CV_8S 1
//#define CV_16U 2
//#define CV_16S 3
//#define CV_32S 4
//#define CV_32F 5
//#define CV_64F 6
//#define CV_16F 7
std::cout << "\n" << "size:" << src.size() << " channels:" << src.channels()
<< " type:" << src.type()
<< "\n";
//初始化一个矩阵,大小为blue的列数和行数,CV_8UC1 类型为8位无符号,通道数为3
//zeros 所有数据填充位0,除此之外还有ones,所有数据填充为1
Mat gray = Mat::zeros(Size(blue.cols, blue.rows), CV_8UC1);
//转换色彩空间将src 转为灰度图,
cvtColor(src, gray, COLOR_BGR2GRAY);
cv::namedWindow("gray", cv::WINDOW_KEEPRATIO);
cv::imshow("gray", gray);
//获取图像的宽高
int cols = gray.cols;
int rows = gray.rows;
Mat white = Mat::zeros(Size(cols, rows), CV_8UC1);
for (int i = 0; i < rows; i++) {
//第i行的首地址,即第i行的第一个像素
uchar * row_gray = gray.ptr(i);
uchar* row_white = white.ptr(i);
for (int j = 0; j < cols; j++) {
//第j列,即第i行的第j个像素
//+10 对黑白图来说,亮度会增加
if(row_gray[j] + 10<=255)
row_white[j] = row_gray[j]+10;
}
}
cv::namedWindow("white", cv::WINDOW_KEEPRATIO);
cv::imshow("white", white);
Mat white_fide;
//归一化到 0 到 1 图像内容变为为零点几,类型也变为了CV_32FC1,单通道32位float
normalize(white, white, 0, 1, NORM_MINMAX,CV_32FC1);
//white_fide = white* 0.8 + 0*0 + 0.02
addWeighted(white, 0.8, Mat::zeros(Size(cols, rows), CV_32FC1), 0, 0.02,white_fide);
cv::namedWindow("white_fide", cv::WINDOW_KEEPRATIO);
cv::imshow("white_fide", white_fide);
auto start = clock(); //记录此时时钟
//拷贝一份内存给out
Mat out = white_fide.clone();
auto end = clock();//记录此时时钟
auto time = end - start;//时钟差即为 消耗的时间 毫秒
//注意 Debug的速度要比Relase 慢很多
std::cout << time<<std::endl;
//图像保存
imwrite("out.jpg", out);
//每隔多少毫秒,等待按键按下,阻塞程序不能往下执行,当参数为0 则一直等待,一直阻塞
//若不阻塞则程序退出,imshow的图像一瞬即逝
cv::waitKey(0);
}
?time 为2
注意
我上面写的是单通道的访问像素点
若为多通道则应这样写
//读文件 注意反斜杠方向
cv::Mat src = imread("C:/Users/FeboReigns/Desktop/CachedImage_1024_768_POS4.jpg");
cv::namedWindow("src", cv::WINDOW_KEEPRATIO);
cv::imshow("src", src);
for (int i = 0; i < src.rows; i++) {
//第i行的首地址,即第i行的第一个像素
uchar* row_src = src.ptr(i);
for (int j = 0; j < src.cols*3; j+=3) {
//第j列,即第i行的第j个像素
//对于三通道来说,j列有三个值,分别为B 分量 G分量 R分量
//我这里对每个分量加不同的值 蓝绿减弱,红色增强
if (row_src[j+0] - 20 >= 0)
row_src[j + 0] = row_src[j + 0] - 20;
if (row_src[j + 1] - 20 >= 0)
row_src[j + 1] = row_src[j + 1] - 20;
if (row_src[j + 2] + 30 <= 255)
row_src[j + 2] = row_src[j + 2] + 30;
}
}
cv::namedWindow("src_1", cv::WINDOW_KEEPRATIO);
cv::imshow("src_1", src);
?
?opencv VS 环境搭建 读取显示图像 访问像素_FeboReigns的博客-CSDN博客C++图像处理入门 平面图 交织图 存储方式_FeboReigns的博客-CSDN博客
|