1、读取图片,灰度化等
命名空间使用cv::,使得opencv库与c++标准库区分开,养成良好的代码风格
#include<opencv2/opencv.hpp> //该头文件包含了opencv的所有函数
int main() {
cv::Mat img = cv::imread("1.jpg",-1); //cv::Mat 表示opencv下的一种数据结构(矩阵类型的结构),这里表示img为一个图片矩阵
//cv::Mat img=cv::imread("1.jpg",-1) //IMREAD_UNCHANGED(<0),小于0的数。表示加载原图
//cv::Mat img=cv::imread("1.jpg",0) //IMREAD_GRAYSCALE(0),等于0的数。表示加载其灰度图
//cv::Mat img=cv::imread("1.jpg",1) //IMREAD_COLOR(>0),大于0的数。表示加载RGB图
if (img.empty()) return -1; //-1表示程序异常退出
cv::namedWindow("1", cv::WINDOW_AUTOSIZE); //创建一个窗口开显示图片
cv::imshow("1", img); //决定在哪个窗口显示哪幅图片,因为通常情况下不止一个窗口和一张图片
cv::waitKey(0); //waitKey的参数大于0,则表示等待此数毫秒的时间;若小于等于0,则直到按下一个键才开始继续运行
cv::destroyAllWindows();
return 0;
}
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main() {
Mat img = imread("C:\\Users\\Administrator.WIN-S21DVH7M0Q7\\Desktop\\op\\1.jpg");
if (img.empty() == 1) {
cout << "can get any input img" << endl;
return -1;
}
namedWindow("img",WINDOW_AUTOSIZE);
imshow("img", img);
waitKey(0);
Mat img1;
cvtColor(img, img1, COLOR_RGB2GRAY); //cvtColor函数的返回值为void
imshow("img1", img1);
waitKey(0);
destroyAllWindows();
return 0;
}
2、访问每个像素:
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
void change1(Mat &img); //使用指针来操作像素点
void change2(Mat &img);//使用迭代器来操作像素点
int main() {
Mat img = imread("C:\\Users\\Administrator.WIN-S21DVH7M0Q7\\Desktop\\op\\1.jpg", -1);
//change1(img);
change2(img);
imshow("change_img", img);
waitKey(0);
destroyAllWindows();
return 0;
}
void change1(Mat &img) { //参数为引用,这样可以改变原图片
int rows = img.rows; //不是rows()
int cols = img.cols;
int chan = img.channels();
//遍历像素点
for (int row = 0; row < rows; row++) {
uchar* ptr_img = img.ptr <uchar>(row); //定义一个uchar型指针,img.ptr<uchar>(row)[colum]
for (int col = 0; col < cols * chan; col++) {
//由于img.ptr<uchar>(row)为指向row行的指针。
//指针相当于数组名,可以通过数组ptr_img[n]来操作此行所有列与通道的元素
ptr_img[col] = 255; //将所有像素点变成白色 ;img.ptr<uchar>(row)[colum]
}
}
}
void change2(Mat& img) {
MatIterator_ < Vec3f > p= img.begin< Vec3f >(); //begin后面必须加< Vec3f >
//< Vec3f >代表每个像素点的三通道
MatIterator_ < Vec3f > p1 = img.end<Vec3f>();
while(p != p1) {
(*p)[0] = 255; //p必须加括号,*p表示一个三元素的数组
//(*p)[1] = 255;
(*p)[2] = 255;
p++;
}
}
3、
for ( int i=0; i<rows; i++ )
{
for ( int j=0; j<cols; j++ )
{
image.at<uchar>(i, j)= 0; // also can be: image.at<uchar>( cv::Point(j, i) ) = 0;
/*
if color one:
image.at<uchar>( i, j*3 + 0 ) = 0;
image.at<uchar>( i, j*3 + 1 ) = 0;
image.at<uchar>( i, j*3 + 2 ) = 0;
*/
}
}
三通道图片之所以,这样遍历:( i, j*3 + 0 ),与图片的内存结构有关
待续。。。。。