图像:

计算机视觉中得图像是数字设备捕获到物理世界的表象。图像中的每个点称为像素,每个像素可以存储一个或者多个值,这取决于它是否为灰色、黑色或者白色。灰度级的图像可以存储一个值,彩色图像可以存储三个值。如:

opencv最大四边形 opencv最大能读取多大的图像_opencv最大四边形

     

opencv最大四边形 opencv最大能读取多大的图像_OpenCV_02

Mat类不只用于存储图像,而且可以存储任意大小的不同类型的矩阵,可以使用它作为代数矩阵,并执行操作。

关于 Mat ,要知道的是你不必再手动地(1)为其开辟空间(2)在不需要时立即将空间释放。但手动地做还是可以的:大多数OpenCV函数仍会手动地为输出数据开辟空间。当传递一个已经存在的 Mat 对象时,开辟好的矩阵空间会被重用。也就是说,我们每次都使用大小正好的内存来完成任务。

基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。因此,当在程序中传递图像并创建拷贝时,大的开销是由矩阵造成的,而不是信息头。OpenCV是一个图像处理库,囊括了大量的图像处理函数,为了解决问题通常要使用库中的多个函数,因此在函数中传递图像是家常便饭。同时不要忘了我们正在讨论的是计算量很大的图像处理算法,因此,除非万不得已,我们不应该拷贝  的图像,因为这会降低程序速度。

opencv最大四边形 opencv最大能读取多大的图像_opencv最大四边形_03

//读写图片
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 实例精解》