OpencvDay01
#include <opencv2\opencv.hpp>
#include <iostream>
#include <sstream>
#include <string>
using namespace cv;
using namespace std;
//主要是遍历像素以及像素取反操作,按照官方教程的解释来看,
//指针遍历及vector遍历,或者数组遍历,在debug的模式下
//会有很大差距,但是在release的模式下,没有太大的差距。
//考虑到大部分人还是会用指针来遍历像素,
//所以,在接下来的操作和学习中不能主观抵触指针以及&的出现和使用。
//按照C++Primer的解释里,不建议使用数组和指针,数组因为它的灵活性欠佳。
//指针因为它的安全性不可靠。作者本身是建议使用vector的,
//typedef是对类型的转换为别名的一种使用方式,
//auto是自动识别数据类型,方便程序使用;
//另外要注意顶层常量和底层常量的区别,
//还有exetern的使用,迭代器的使用,Vector的使用,
//相比之下::的使用较为简单好理解。主要是
//侧重于指针,数组,vector的使用和理解,
//其中有个右左原则,即数据类型不管多么复杂,
//从数据名字开始,优先向右确定类型,遇到括号就往左,然后再向右
int main(int artc,char **argv)
{
Mat image = imread("H:\X99.jpeg",IMREAD_ANYCOLOR);
Mat picture;
image.copyTo(picture);
if (image.empty())
{
printf("could not load image...\n");
return -1;
}
namedWindow("美女",WINDOW_FREERATIO);
imshow("美女",image);
//Mat gray;
//cvtColor(image, gray, COLOR_BGR2GRAY);
//imshow("美女变颜色", gray);
//imwrite("H:/变颜色.jpeg", gray);
printf("\n变颜色.jpeg的大小:=", gray.size);
//Mat picture1 = imread("H:\changeColor.jpeg",1);
int a = stoi(picture1.size, nullptr, 16);
//cout << "变颜色.jpeg的大小" << dec << picture1.size << endl;
//imwrite("H:/变颜色.bmp", gray);
//Mat picture2= imread("H:\changeColor.bmp", 1);
printf("\n变颜色.bmp的大小:=", gray.size);
//cout << "变颜色.bmp的大小" << picture2.size << endl;
//Mat m1 = picture1.clone();//完全不同的地址的一个相同的对象
//Mat m3 = picture1;//这里分为深拷贝和浅拷贝
//Mat m4 = Mat::zeros(picture1.size(), picture1.type());
//Mat m5 = Mat::zeros(Size(500, 500), CV_8UC3);
//Mat m6 = Mat::zeros(picture1.size(), picture2.type());
//图像像素的遍历与访问,需要读取行数,列数,通道数(彩色图像中,每一列的像素值是由不同的通道数的值组合而成的)
int height = image.rows;
int width = image.cols;
int ch = image.channels();
for (size_t i = 0; i < height; i++)
{
for (size_t j = 0; j < width; j++)
{
if (ch==3)
{
Vec3b bgr = image.at<Vec3b>(i, j);
bgr[0] = 255 - bgr[0];
bgr[1] = 255 - bgr[1];
bgr[2] = 255 - bgr[2];
image.at<Vec3b>(i, j) = bgr;
}
else if (ch ==1)
{
int gray = image.at<uchar>(i, j);
image.at<uchar>(i, j) = 255 - gray;
}
}
}
imshow("遍历取反像素", image);
Mat result = Mat::zeros(image.size(), image.type());
int blue = 0, green = 0, red = 0;
int gray;
for (int row = 0; row < image.rows; row++)
{
uchar* current_row = picture.ptr<uchar>(row);
//.ptr是用来访问Mat对象的首地址的。(类似于迭代器的begin)
uchar* result_row = result.ptr<uchar>(row);
for (int row = 0; row < image.rows; row++)
{
if (ch ==3)
{
blue = *current_row++;//总共是3个通道,每读一个通道,就自增1,三个通道各自增1之后,就到达了下一行的起始位置
//cout << "blue:=" << blue << "*current_row:=" << current_row << endl;
green = *current_row++;
//cout << "green:=" << green << "*current_row:=" << current_row << endl;
red = *current_row++;
//cout << "red:=" << red << "*current_row:=" << current_row << endl;
*result_row++ = blue;
//cout << "*result_row:=" << *result_row << endl;
*result_row++ = green;
//cout << "*result_row:=" << *result_row << endl;
*result_row++ = red;
//cout << "*result_row:=" << *result_row << endl;
}
else if (ch==1)
{
gray = *current_row++;
*result_row++ = gray;
}
}
}
// int a = 0, b = 0,c = 0;
// int a1, b1, c1;
// int * a2 = nullptr;
// int * b2 = nullptr;
// int * c2 = nullptr;
//for (size_t i = 0; i < 10; i++)
// {
// a1 = a++;
// //cout << "a1:=" << a1 << endl << "a:=" << a << endl;
// b1 = a++;
// //cout << "b1:=" << b1 << endl << "a:=" << a << endl;
// c1 = a++;
// //cout << "a1:=" << c1 << endl << "a:=" << a << endl;
//
//
// *a2 ++= a1;
// cout << "a2:=" << *a2 << endl << "a1:=" << a1 << endl;
// *b2 ++= b1;
// cout << "b2:=" << *b2 << endl << "b1:=" << b1 << endl;
// *c2 ++= c1;
// cout << "a2:=" << *c2 << endl << "c1:=" << c1 << endl;
// }
imshow("遍历复制像素", result);
waitKey();
return 0;
}