Mat 用于管理图像在内存中的存储,在Opencv 3 中由于使用了内存自动管理机制,所以不必像最早的Opencv一样需要手动分配和释放内存空间,Mat是由两个部分组成的。一个图像数据矩阵头包括(矩阵尺寸、存储方法、存储地址等信息),另一个是指向存储图像所有像素值的矩阵空间的指针。 这样设计是由于一般图像数据都是比较大的,并且很多时候都是需要经过多个不同的函数处理,这就导致了需要在不同的函数间传递这个大数据结构,除非万不得已不会选择去传递比较大的Mat。所以Opencv设计了这种结构来完成Mat的快速传递,Mat矩阵头是一个常数值,而矩阵保存了图像所有的像素值,这部分通常会比矩阵头大几个数量级,在函数间传递参数的时候每个Mat都有自己的信息头,但是矩阵数据是共享的,也就是在传递Mat时,只复制矩阵头和指向矩阵的指针。
cd ~ git clone https://github.com/Itseez/opencv.git cd opencv git checkout 3.0.0 cd ~ git clone https://github.com/Itseez/opencv_contrib cd opencv_contrib git checkout 3.0.0
使用cmake编译opencv
cd ~/opencv mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_C_EXAMPLES=ON \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D BUILD_EXAMPLES=ON .. make -j4
这时候有可能会报如下错误:
/usr/bin/ld: /usr/local/lib/libavcodec.a(avpacket.o): relocation R_X86_64_32 against `.rodata.str1.1’ can not be used when making a shared object; recompile with -fPIC /usr/local/lib/libavcodec.a: error adding symbols: Bad value collect2: error: ld returned 1 exit status make[2]: *** [lib/libopencv_videoio.so.3.0.0] Error 1 make[1]: *** [modules/videoio/CMakeFiles/opencv_videoio.dir/all] Error 2 make: *** [all] Error 2
这是由于你当时编译ffmpeg的时候方式不对,参考如下结合方法:
I had the same problem while compiling opencv3 alpha on Ubuntu 14.04 with FFMPEG enabled. My FFMPEG was the git version compiled with ./configure make sudo make install I had to recompile FFMPEG with ./configure –enable-nonfree –enable-pic –enable-shared
That did the trick for me and after that opencv3 compiled fine.