opencv Mat对象初始化、图像像素读取(1)_听取蛙声一片的博客-程序员宅基地

技术标签: C++  opencv  

1、Mat对象初始化

#include<opencv2/opencv.hpp>
    #include<iostream>
    using namespace std;
    using namespace cv;
    int main()
    {
    	Mat srcImg = imread("C:/Users/admin/Desktop/1.JPG");
    	if (!srcImg.data)
    	{
    		printf("未找到图像");
    		return -1;
    	}
    	namedWindow("srcImage Window", CV_WINDOW_AUTOSIZE);
    	imshow("srcImage Window", srcImg);
    	Mat csrc;
    	Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
    	filter2D(srcImg, csrc, -1, kernel);
	
namedWindow("csrcImage Window", CV_WINDOW_AUTOSIZE);
imshow("csrcImage Window", csrc);
/*Mat dst;
dst=Mat(srcImg.size(), srcImg.type());//大小、类型
dst = Scalar(127, 0, 255);//3个通道*/
//Mat dst = srcImg.clone();//完全copy
Mat dst;
//srcImg.copyTo(dst);

cvtColor(srcImg, dst, CV_BGR2GRAY);

printf("dst通道数:%d\n",dst.channels());
printf("srcImg通道数:%d", srcImg.channels());

int cols = dst.cols;//列
int rows = dst.rows;//行
int channels = dst.channels();//通道数

const uchar* pFirstRow = dst.ptr<uchar>(0);

printf("first image value:%d", *pFirstRow);

//定义一个3*3像素集合 8bit uc:uchar  3:3通道  BGR:(0,0,255)红色 Scalar 向量长度与通道数一致
Mat M(3, 3, CV_8UC3, Scalar(0, 0, 255));//作用:验证算法正确性
//cout << "M=" << endl << M << endl;
//创建Mat对象2
Mat M1;
M1.create(srcImg.size(), srcImg.type());
M1 = Scalar(0,0,255);

Mat m2 = Mat::zeros(srcImg.size(), srcImg.type());//与输出图像大小一致,
Mat m3 = Mat::zeros(2, 2, CV_8UC1);//
Mat m4 = Mat::eye(2, 2, CV_8UC1);
waitKey(0);

}

2、图像像素读写

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>
using namespace std;
using namespace cv;
int main()
{
	Mat dst_gray;
	Mat srcImg = imread("C:/Users/admin/Desktop/1.JPG");
	if (!srcImg.data)
	{
		printf("未找到图像");
		return -1;
	}
	namedWindow("srcImage Window", CV_WINDOW_AUTOSIZE);
	imshow("srcImage Window", srcImg);
	
cvtColor(srcImg, dst_gray, CV_BGR2GRAY);
namedWindow("dst_grayImage Window", CV_WINDOW_AUTOSIZE);
imshow("dst_grayImage Window", dst_gray);
int hight = dst_gray.rows;
int width = dst_gray.cols;
//读写像素

//
for (int i = 0; i < hight; i++)
{
	for (int j = 0; j < width; j++)
	{
		int gray = dst_gray.at<uchar>(i,j);
		dst_gray.at<uchar>(i, j) = 255 - gray;//只适用于单通道
		//cout << gray << endl;
	}
}

Mat dst;
dst.create(srcImg.size(), srcImg.type());
hight = dst.rows;
width = dst.cols;
int nc = dst.channels();
//bitwise_not(srcImg,dst);
//bitwise_not(src,dst)  函数的实现
for (int rows = 0; rows < hight; rows++)
{
	for (int cols = 0; cols < width; cols++)
	{
		if (nc==1)
		{
			int gray = dst_gray.at<uchar>(rows, cols);
			dst_gray.at<uchar>(rows, cols) = 255 - gray;
		}
		else if (nc==3)
		{
			int b = srcImg.at<Vec3b>(rows, cols)[0];
			int g = srcImg.at<Vec3b>(rows, cols)[1];
			int r = srcImg.at<Vec3b>(rows, cols)[2];
			dst.at<Vec3b>(rows, cols)[0] = 255 - b;
			dst.at<Vec3b>(rows, cols)[1] =255-g;
			dst.at<Vec3b>(rows, cols)[2] =255-r;
			dst_gray.at<uchar>(rows, cols) = min(r, min(b, g));
		}
	}
}
namedWindow("dst11_grayImage Window", CV_WINDOW_AUTOSIZE);
imshow("dst11_grayImage Window", dst);

namedWindow("dst1_grayImage Window", CV_WINDOW_AUTOSIZE);
imshow("dst1_grayImage Window", dst_gray);
waitKey(0);

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_42885712/article/details/94065307

智能推荐

java动态规划算法_南风知易✓✓✓的博客-程序员宅基地

java 动态规划算法递归算法的时间复杂度=递归的次数递归函数本身的时间复杂度*

典型电路的收集与记录__Jason^_^的博客-程序员宅基地

5V to 3V3通过AMS1117-3.3,将电压降至3V3,钽电容是必须的。蜂鸣器电路通过ss8050的NPN三极管实现对蜂鸣器的控制LED电路通过限流电阻对LED的电流和亮度进行控制。但每种颜色所配合的电阻还需实验,达到LED能亮同时又不晃眼睛的效果。...

Spinner的两种调用数据放式_faith_boys的博客-程序员宅基地

ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, mLmtdReptStr);adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);mSpinner.setAd

ROS arbotix踩坑:‘rospkg‘、except UnicodeDecodeError, exc、dynamic module does not define init function_#君君#的博客-程序员宅基地_ros 安装rospkg

在执行roslaunch mbot_description arbotix_mbot_with_camera_xacro.launch文件时,即包含arbotix模块的程序时,报错No module named ‘rospkg’ 。报错No module named 'rospkg'经过对大家文章的查看,发现基本集中在把环境配置为python3.或者安装rospkg。但是仍没有解决。查看opt/ros/melodic/lib/python2.7/dist-packages,发现根本没有ro.

面试题:实现数组扁平化_weixin_34056162的博客-程序员宅基地

什么是数组扁平化数组扁平化是指将一个多维数组变为一维数组reduce 方法实现reduce 本身就是一个迭代循环器,通常用于累加,所以根据这一特点有以下:const arr1 = [1,[4,6],[8,3,[19,38]]]function flatten(arr) { return arr.reduce((result, item)=&gt; { return re...

JfreeChart用法总结_shiyan0634的博客-程序员宅基地

一、简介 WW 的发展使得基于因特网的应用程序不再局限于静态或者简单的动态内容提供。传统的一些以软件包形式发布应用程序例如报表系统等都在逐渐搬到因特网上。但是这两者之间有着天壤之别,虽然对于数据获取、业务处理等方面基本类似,但是最大的差别在于用户界面。为了能在web浏览器上显示要求用户界面使用 HTML以及图片的方式来展现数据,而传统的一些利用操作系统本身的控件来开发的用户界面无法适应琳琅满目

随便推点

聊聊身份认证的那些事(开篇)_罗斯839的博客-程序员宅基地_cas流程

开篇身份认证,对于一个安全的应用来说,是第一道门槛,它为后续所有的安全措施提供了“身份”这样一个关键信息。通常每个公司会有好几个外部应用,如果每一个应用使用独立的账号体系,管理起来会非常复杂,用户也需要保存好几个账号密码,严重影响使用体验。而且公司内部的各个管理或开发系统,比如各种服务器、confluence、jira、gitlab等也都使用单独的账号,一个开发人员要记住各种纷繁杂乱的账号和密码,如果不提前保存下来,根本不可能能靠记忆完成输入。这时,如何设计一个简单易用的身份认证体系就显得尤为重要

Vscode的使用小技巧_weixin_30399821的博客-程序员宅基地

命令行启动code如果你的系统是Linux系统(我使用的是Ubuntu 16.04)这样就可以直接使用 code + filename来编辑文件(就像vi + filename)如果你的系统是MacOS 就需要在vscode里面按 command + shift + p 之后输入 shell 基本上在第一提示里面就会显示安装code,如图所示转载于:https://www.cnblo...

SpringMVC -> 转发(forward)和重定向(redirect)_欧皇小德子的博客-程序员宅基地_springmvc转发的关键字是redirect

默认写法就是转发:return的字符串将对应的前端页面转发到要求的url上配置了视图解析器的viewsresolver @RequestMapping("/hello/{a}/{b}") public String hello(@PathVariable int a, @PathVariable int b, Model model) { model.addAttribute("haha", "结果:" + (a + b)); return "hello"; }没有视图解析器

ros kinetic 自带opencv3 与 opencv 2 的兼容问题_原野寻踪的博客-程序员宅基地

问题分析自己写的系统必须基于opencv 2.x,而ros kinetic自带了opencv3的版本。于是在编译时报错:/usr/bin/ld: CMakeFiles/xxxx.cpp.o: undefined reference to symbol '_ZN2cv6String10deallocateEv'/opt/ros/kinetic/lib/x86_64-linux-gnu/l...

Latex002 | 详细教程:LaTeX 编译器哪个好?——如何在 Visual Studio Code 中全流程编写 LaTeX(上篇)_爱学习的Allan的博客-程序员宅基地_latex编译器

你是否在编写 LaTeX 过程中遇到了编译器“不给力”,无法自动补全、缩进等问题?本文比较了流行的 LaTeX 的编译器,并简要分析了其优势与不足,最终给出解决方案。