完成
- 自己创建指定mat
- 用算法创建mat
- 克隆mat
相关函数
mat.clone();
mat.copyTo();
(1) Mat::Mat()
(2) Mat::Mat(int rows, int cols, int type)
(3) Mat::Mat(Size size, int type)
(4) Mat::Mat(int rows, int cols, int type, constScalar& s)
(5) Mat::Mat(Size size, int type, constScalar& s)
(6) Mat::Mat(const Mat& m)
mat.ptr<uchar>
实现
使用函数克隆一个一样的图
使用函数创建空白图(全0和全255)
使空白图成为渐变灰度图
使空白图成为渐变色度图
笔记
关于clone() \ copyTo() 和 直接赋值的区别
clone和copyTo是直接重新创建一个新的内存空间
而直接赋值则是一个类似传递的作用,这样直接修改B的内容也会影响到A
区分Scalar和Vec3b
Scala指标量,Vec指向量
Vec类似于C++中的Vector 也就是说可用{}赋值
Scala我现在只知道在初始化中可用
相关
无
源
// OpenCV_Template.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <string>
#include<opencv2\opencv.hpp>
using namespace std;
using namespace cv;
int main(int argc, char** argv){
/**************************************** 初始化 ****************************************************/
Mat imgIn, imgOut;
Mat mask;
imgIn = imread("Test.jpg");
//imgOut = imgIn; //证实了这种复制方法只是把in的地址给了out,如果改变out内容,则in也会改变
imgIn.copyTo(imgOut); //这种方式会分配新的内存,且会检测需不需要分配新地址
//imgOut = imgIn.clone(); //这种方法会分配新的内存,且一定会分配新地址
/**************************************** 初始化 ****************************************************/
/**************************************** 图像操作 ****************************************************/
int cont = 0;
int i, j;
//创建指定Mat
//imgOut = Mat(100, 100, CV_8UC3, Scalar(0, 0, 0)); //创建全黑图像
//imgOut = Mat(100, 100, CV_8UC3, Scalar(255, 255, 255)); //创建全白图像
//像素归零
//for (j = 0; j < imgOut.rows; j++) {
// for (i = 0; i < imgOut.cols*3; i++) {
// imgOut.at<uchar>(j, i) = 0; //at方法相当于在操作矩阵,对于这种三个像素一组的矩阵操作不方便,也是col要乘三的原因;
// }
//}
//算法创建渐变灰度图(at方法)(防溢出)
//imgOut = Mat(500, 255, CV_8UC1);
//uchar gray = 0;
//for (j = 0; j < imgOut.rows; j++) {
// gray = saturate_cast<uchar>(j);
// for (i = 0; i < imgOut.cols; i++) {
// imgOut.at<uchar>(j, i) = gray;
// }
//}
//算法创建渐变灰度图(ptr方法)(防溢出)(单通道图像操作)
//imgOut = Mat(500, 255, CV_8UC1);
//uchar gray = 0;
//uchar* index;
//for (j = 0; j < imgOut.rows; j++) {
// gray = saturate_cast<uchar>(j);
// for (i = 0; i < imgOut.cols; i++) {
// index = imgOut.ptr<uchar>(j, i);
// *index = gray;
// }
//}
//算法创建渐变灰度图(ptr方法)(防溢出)(多通道图像操作)
imgOut = Mat(255, 255, CV_8UC3, Scalar(0,0,0));
Vec3b color = {0,0,0}; //与c++的vector类似,可以通用?
Vec3b* index;
for (j = 0; j < imgOut.rows; j++) {
for (i = 0; i < imgOut.cols; i++) {
color = { saturate_cast<uchar>(j),saturate_cast<uchar>(i) ,0 };
index = imgOut.ptr<Vec3b>(j, i);
*index = color;
}
}
/**************************************** 图像操作 ****************************************************/
/**************************************** 图像输出 ****************************************************/
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", imgIn);
namedWindow("output", WINDOW_AUTOSIZE);
imshow("output", imgOut);
//cout << "Mat=" << endl << imgOut << endl;
/**************************************** 图像输出 ****************************************************/
waitKey(0);
return 0;
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门使用技巧:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件