if(MULTIPLE_THREAD)
{
if(inputImageCnt % 2 == 0)
{
mBuf.lock();
featureBuf.push(make_pair(t, featureFrame));
mBuf.unlock();
}
}
这里inputImageCnt(处理的帧数)是能整除2的时候才会对featureBuf进行填充,就是说明处理了两帧,featureBuf才会填充一帧的信息。
RGBA是代表Red(红色)Green(绿色)Blue(蓝色)和Alpha的色彩空间。虽然它有的时候被描述为一个颜色空间,但是它其实仅仅是RGB模型的附加了额外的信息。采用的颜色是RGB,可以属于任何一种RGB颜色空间,但是Catmull和Smith在1971至1972年间提出了这个不可或缺的alpha数值,使得alpha渲染和alpha合成变得可能。提出者以alpha来命名是源于经典的线性插值方程αA + (1-α)B所用的就是这个希腊字母。
alpha通道一般用作不透明度参数。如果一个像素的alpha通道数值为0%,那它就是完全透明的(也就是看不见的),而数值为100%则意味着一个完全不透明的像素(传统的数字图像)。在0%和100%之间的值则使得像素可以透过背景显示出来,就像透过玻璃(半透明性),这种效果是简单的二元透明性(透明或不透明)做不到的。它使数码合成变得容易。alpha通道值可以用百分比、整数或者像RGB参数那样用0到1的实数表示。
RGBA是四通道
RGB是三通道
两个的形式的图转灰度图需要区分
R代表红,red; G代表绿,green; B代表蓝,blue。RGB模式就是,色彩数据模式,R在高位,G在中间,B在低位。BGR正好相反。 ,转化成灰度图的时候需要进行区分
if(mImGray.channels()==3)
{
if(mbRGB)
cvtColor(mImGray,mImGray,CV_RGB2GRAY);
else
cvtColor(mImGray,mImGray,CV_BGR2GRAY);
}
else if(mImGray.channels()==4)
{
if(mbRGB)
cvtColor(mImGray,mImGray,CV_RGBA2GRAY);
else
cvtColor(mImGray,mImGray,CV_BGRA2GRAY);
}
如果mask不是NULL,也就是说mask是一个数组,并且是一个和dst or src大小完全一致的数组。
这时遍历src的每一个元素,
(1)在位置i时候如果mask对应的值为不为0,那么把src (i) 的值复制给dst (i) 。
(2)如果mask(i) 为0,那么不管src(i)是什么,dst(i)都设置为0.
mask = NULL 意思就是没有模板、不使用掩码操作
特别注意:
mask必须是CV_8U类型
srcImage.copyto(dstImage, mask),mask作为一个掩模板,如果在某个像素点(i, j)其值为1(只看第一通道,所以mask单通道即可)则把srcImage.at(i, j)处的值直接赋给dstImage.at(i, j),如果其值为0则dstImage.at(i, j)处保留其原始像素值
关于此函数的源码解析可查看:http://blog.csdn.net/jdpshq/article/details/9007627
可用来有效查询例如某个工程调用了哪个版本的opencv
ldd (bin name)
前提这张图片是CV_8U数据类型
在opencv编译前,在CMakeLists文件中会有一些功能的开关
找到
OCV_OPTION(WITH_QT
"Build with Qt Backend support"
OFF IF (NOT ANDROID AND NOT IOS AND NOT WINRT) )
把OFF改为ON,重新编译,以及安装,安装前需要先看好,安装的路径,如果直接安装到usr/bin下有可能会覆盖之前版本,所以可以选择安装在当前需要该opencv版本的工程下,但是需要该工程的调用路径
指针偏移
pixel_rgb_ptr=rectified_stereo_pair.image_left_color.ptr(v);
其中指针偏移要注意
const uint8_t b = pixel_rgb_ptr[3 * u];
const uint8_t g = pixel_rgb_ptr[3 * u + 1];
const uint8_t r = pixel_rgb_ptr[3 * u + 2];
其中v是行,u是列,bgr存储顺序是并列存储,那么图像实际存储的尺寸是3widthheigh
cv::Vec3b
const uint8_t b=rectified_stereo_pair.image_left_color.at(v,u)[0];
const uint8_t g=rectified_stereo_pair.image_left_color.at(v,u)[1];
const uint8_t r=rectified_stereo_pair.image_left_color.at(v,u)[2];
这种方法不需要进行偏移,只需要给行v列u坐标就可以得到当前bgr分量的数组
make install不能随意使用,很可能被安装到/user/bin/中覆盖掉已有环境数据。因此在编译一些工程时候对于仅现当前工程使用的库,建议制定安装目录
方法一:
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
方法二:
修改cmake文件,加入:
SET(CMAKE_INSTALL_PREFIX < install_path >)
方法三:
export DESTDIR=/INSTALL/DIR
make install
方法四:
make DESTDIR=/install/directory install
进行图像1/4的降采样以及内参的也进行1/4的减小
这里值得注意的是,在降采样/上采样过程中,要确保图片能够正确读取,否则会出现错误
eror: (-215:Assertion failed) !_src.empty() in function 'cv::pyrDown_'
使用cv::pyrDown,或者cv::resize进行降采样,一次只能是缩放1/2,那么缩放1/4可集执行两次1/2缩放
官方提供方法,可在ROS安装教程界面找到
apt-cache search ros-kinetic(版本号)
如果环境中缺失某些依赖,可查找ros相关的功能包
http://www.opencv.org.cn/forum/
opencv的中文资料
https://docs.opencv.org/master/index.html
opencv document直接输入函数名可以查找相关信息
Eigen::Vector3d euler_angles = rotation_matrix.eulerAngles ( 2,1,0 );
// ZYX顺序,即 yaw pitch roll顺序
evo_traj tum evo_xag75.txt --plot
FIND_PACKAGE(Eigen3 REQUIRED NO_MODULE PATHS /home/fei/git-project/openmvs_keo/eigen_install NO_DEFAULT_PATH)
if(EIGEN3_FOUND)
INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIRS})
ADD_DEFINITIONS(${EIGEN_DEFINITIONS} -D_USE_EIGEN)
message("EIGEN_INCLUDE_DIRS: ${EIGEN_INCLUDE_DIRS}")
message("EIGEN3_INCLUDE_DIRS: ${EIGEN3_INCLUDE_DIRS}")
SET(_USE_EIGEN TRUE)
endif()
这里的路径就是Eigen的安装路径,和opencv不一样,要注意eigen安装后也是有.cmake文件的。如果没有则是安装有问题,编译会出现找不到eigen的错误
find_package(OpenCV REQUIRED NO_MODULE PATHS /home/fei/OpenCV/opencv3.3.1/opencv3.3.1-install/lib/cmake/opencv4 NO_DEFAULT_PATH)
if(OpenCV_FOUND)
INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS})
ADD_DEFINITIONS(${OpenCV_DEFINITIONS})
SET(_USE_OPENCV TRUE)
MESSAGE(STATUS "OpenCV ${OpenCV_VERSION} found (include: ${OpenCV_INCLUDE_DIRS})")
else()
MESSAGE("-- Can't find OpenCV. Please specify OpenCV directory using OpenCV_DIR variable")
endif()
需要注意的是,这里的路径是安装路径下包含.cmake文件的路径,注意:不同的版本可能路径不一样,不能随意照搬
error while loading shared libraries: libopencv_highgui.so.3.0:
cannot open shared object file
一般可执行文件静态库已经被编译进了文件中,但是动态文件(.so)可能需要指定路径,特别是移植可执行文件到别的机器上的时候,就容易出现这个问题
解决:
ldd bin文件查看缺少哪些库:但是一般运行bin后就会弹出
locate libopencv_imgcodecs.so.3.0
或者直接在自定义的opencv安装路径下搜索
sudo gedit /etc/ld.so.conf.d/opencv.conf(名字自定义)
在文件下添加动态库的绝对路径,如
/home/fei/OpenCV/opencv3.2.0/opencv-3.2.0-install/lib
保存后运行,不可漏
ldconfig
find . |xargs grep x
x是关键词
step[0]是矩阵中一行元素的字节数
step[1]是矩阵中一个元素的字节数(elemSize)
step1 = step / elemSize1,elemSize1是元素的每个通道所占的字节数
step1(0)是矩阵一行元素的通道数(不是很贴切)
step1(1)是矩阵一个元素的通道数(channel())
sudo curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
参考https://blog.csdn.net/okcd00/article/details/84255669