基础知识
(1)OpenCV的图像格式
一般的图像文件格式使用的是 Unsigned 8bits
CvMat矩阵对应的参数类型就是
CV_8UC1,CV_8UC2,CV_8UC3。
最后的1、2、3表示通道数
最常用的是RGB三通道图像,CV_8UC3
而float 是32位的,对应CvMat数据结构参数就是:CV_32FC1,CV_32FC2,CV_32FC3...
double是64bits,对应CvMat数据结构参数:CV_64FC1,CV_64FC2,CV_64FC3等。
(2)cv::Mat 和cvMat的区别
cv::Mat是一个类(Class),而CvMat是一个Struct,从类型上就可以知道二者存在很大区别。前者除了几个成员变量之外还有很多的成员函数和重载函数,可以实现很多的图像数据处理功能,而后者只有几个成员变量,要对其成员进行一些处理,需要借用别的函数。
(3)Scalar
Scalar可以理解成设置颜色
Scalar(0)是单通道的黑色
Scalar(0,0,0)是三通道RGB的黑色,注意OpenCV顺序是BGR
加载一张图像获取分辨率
#include "opencv2/opencv.hpp"
cv::Mat img;
img = cv::imread("c.jpg");
int height = img.rows;
int width = img.cols;
创建一个三通道RGB的 Mat默认设为蓝色
cv::Mat img2(height, width, CV_8UC3, cv::Scalar(255, 0, 0));
对图像像素进行取值和修改赋值的方法
for (int i = 0; i < height/2; i++)
for (int j = 0; j <width; j++)
{
//方法一:利用Vec3b
img2.at<cv::Vec3b>(i,j) = cv::Vec3b(0,0,255);
}
for (int i = 0; i < height/2; i++)
for (int j = 0; j <width; j++)
for (int n = 0; n < img2.channels(); n++)
{
//方法2:依次获取BGR
if (n == 0)
img2.at<uchar>(i, j*img2.channels() + n)=0;
else if (n == 1)
img2.at<uchar>(i, j*img2.channels() + n) = 0;
else if (n == 2)
img2.at<uchar>(i, j*img2.channels() + n) = 255;
}
图像像素的部分拷贝
for (int i = 0; i < height*width; i++)
{
int x = i%width;
int y = i / width;
if (labels[i] == 15)
{
img2.at<cv::Vec3b>(y,x) = img.at<cv::Vec3b>(y, x);
}
}
图像克隆,A是Mat图像
Mat F = A.clone();
Mat G;
A.copyTo(G);
char result_name[128];
sprintf_s(result_name, 128, "result_%d.jpg", numSuperpixel);
cv::imwrite(result_name, result);
//imshow用于显示和更新
cv::imshow("result", result);