图像:
计算机视觉中得图像是数字设备捕获到物理世界的表象。图像中的每个点称为像素,每个像素可以存储一个或者多个值,这取决于它是否为灰色、黑色或者白色。灰度级的图像可以存储一个值,彩色图像可以存储三个值。如:
Mat类不只用于存储图像,而且可以存储任意大小的不同类型的矩阵,可以使用它作为代数矩阵,并执行操作。
关于 Mat ,要知道的是你不必再手动地(1)为其开辟空间(2)在不需要时立即将空间释放。但手动地做还是可以的:大多数OpenCV函数仍会手动地为输出数据开辟空间。当传递一个已经存在的 Mat 对象时,开辟好的矩阵空间会被重用。也就是说,我们每次都使用大小正好的内存来完成任务。
基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。因此,当在程序中传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。OpenCV是一个图像处理库,囊括了大量的图像处理函数,为了解决问题通常要使用库中的多个函数,因此在函数中传递图像是家常便饭。同时不要忘了我们正在讨论的是计算量很大的图像处理算法,因此,除非万不得已,我们不应该拷贝 大 的图像,因为这会降低程序速度。
//读写图片
void Test::pictureTest()
{
Mat color=imread("./IMG_4145.JPG");
Mat gray=imread("./IMG_4145.JPG",0);
imwrite("./test.JPG", gray);
int row=color.cols-1;
int col=color.rows-1;
cout<<row<<endl;
cout<<col<<endl;
imshow("BGR", color);
imshow("gray", gray);
waitKey(0);
}
//打开摄像头
void Test::vedioTest(){
VideoCapture cap;
cap.open(0);
if(!cap.isOpened()){
return ;
}
namedWindow("Video",1);
while(1){
Mat frame;
cap>>frame;
imshow("Video", frame);
if(waitKey(30)>=0)
{
break;
}
}
cap.release();
}
参考:
《OpenCV 实例精解》