#include"opencv2/core/core.hpp"
#include"opencv2/highgui/highgui.hpp"
#include
int main()
{
//创建空图像,并读取输入图像
cv::Mat image;
image = cv::imread("morph01.jpg");
if (image.empty()) { //错误处理
std::cout << "图像打开发生错误"<
cv::Mat image;
cv::Mat image(240,320,CV_8U,100);
对于彩色图像,因为每个元素包含多个值,因此OpenCV引入了一个简单的数据结构
cv::Scalar,用于在调用函数时传递像素值。该结构通常包含一个或三个值:
cv::Mat image(240,320,CV_8UC3,cv::Scalar(0,0,255));
也可以用Size结构来创建新图像:
cv::Mat image(cv::Size(320,240),CV_8UC3);
也可以调用create方法来创建新图像,准确的说是分配图像的数据块,因为调用它的对像已经存在。如果新图像的大小和类型与原来的相同,就不会重新分配内存,提高了性能。
//重新分配一个新图像
//(仅在大小或类型不同时)
image.create(200,200,CV_8U);
Mat这种数据结构通过实现计数引用和浅复制,避免了C++动态内存分配中经常发生的内存泄漏问题。计数引用的例子可参考C++11中的智能指针的原理。浅复制即两个图像之间赋值时,图像数据(即像素)并不会被复制,此时两个图像都指向同一个内存块。
cv::Mat image2(image1);
//或者
image2=image1;
image1.copyto(image2);
//或者
cv::Mat image2=image1.clone();
如果拷贝后的图像数据类型发生了改变,可使用convertTo方法,注意这两个图像通道数必须相同:
//转换成浮点型图像[0,1]
image1.convertTo(image2,CV_32F,1/255.0,0.0);
在OpenCV参考文档中,有很多函数使用
cv::InputArray类型作为输入参数。cv::InputArray类型是一个简单的代理类,用来概括OpenCV中数组的概念,避免同一个函数因为使用了不同类型的输入参数而出现了多个不同的版本。也就是说你可以在参数中使用Mat对象或其他类型比如std::vector,cv::Scalar和cv::Vec,InputArray只是一个接口,因此不能在代码中显式地定义它。此外相对应地,
cv::OutputArray用来指定某些函数的返回数组。
IplImage* iplImage=cvLoadImage("hello.bmp");
cv::Mat image(iplImage,false);
第二个参数默认值为false,代表不复制数据,若需复制,可把它设置为true。
cv::Ptr iplImage=cvLoadImage("hello.bmp");
cv::Mat imageROI(image, cv::Rect(image.cols-image2.cols, 0, image2.cols, image2.rows));
或者:
cv::Mat imageROI = image(cv::Range(0, image2.rows), cv::Range(image.cols - image2.cols, image.cols));
在这里将image2嵌入到image的某个位置:
image2.copyTo(imageROI);
结果如下:
cv::Mat mask;
mask = cv::imread("333.jpg",CV_LOAD_IMAGE_GRAYSCALE);
image2.copyTo(imageROI,mask);
mask图像: