1.读取图像
/* SDI frame processing */
sdi_grabber lGrabber;
// ... SDI init
// Grabbing loop
while(1) {
SDI_Frame lFrame = lGrabber.FramePop();
// UMat is in lFrame.UMat
if (!lFrame.mUMat.empty() {
// UMat processing
}
// We need to push the buffer back
lGrabber.FramePush(lFrame);
}
相机将拍到的内容在SDI中以帧队列的形式存放,lGrabber调用FramePop()方法获取一帧图像数据,在SDI_Frame中的mUMat属性中就是我们将要操作的图片数据。
调用setInputImage()方法将待操作的UMat图像传入我们的车道线检测类中进行处理。
2.灰度化
我们从摄像头中获取到的数据都是VSDK_8UC3这中RGB彩色图片,但在APEX中的处理对象几乎都是VSDK_8UC1这种灰度图,所以首先要将彩色图转换为灰度图。
apexcv::ColorConverter colorcv2grey_op.Initialize(vsdkWarpOriImage, colorcv2rgb_op.eBGR888_TO_GREY,
vsdkWrapImageGray);
colorcv2grey_op.ReconnectIO(vsdkOriImage, vsdkWrapImageGray);
colorcv2grey_op.Process();
转换后的图像:
3.透视变换
目前一种比较通用一种车道检测方法是将要检测的车道位置以ROI(region of interest)的方式画出来,将ROI区域变为鸟瞰区域,这样首先过滤掉了大量无关数据,同时因距离原因会造成的直线车道线变成梯形车道线,通过透视变换的方法做成的鸟瞰图,可以将这种梯形车道线还原成正常的直线。
透视变换的本质是将图像投影到一个新的视平面,其通用变换公式为:
(u,v)为原始图像像素坐标,(x=x’/w’,y=y’/w’)为变换之后的图像像素坐标。透视变换矩阵图解如下: