Opencv初探Mat像素

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

self85

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值