- 无人驾驶中的检测:
图片/点云 ——>2D/3D
bounding box- 基于图片的检测算法:
general idea
two-step:RCNN SPPnet Fast-RCNN Faster-RCNN
one-step:YOLO SSD YOLO-v2 YOLO-v3
Tensorflow实战Faster-RCNN- 基于激光雷达点云的检测算法:
激光雷达点云简介
Pixel-Based Voxel-Based Tree-Based Point-Based
实战基于点云的目标检测
图片检测即 detection既包含目标物体的类别,又包括目标物体的位置,因此主题思路就是先找到图像的ROI区域,然后进行类别区分,最后确定目标位置
=============== =思路= ================
1、RCNN
- 位置:Selective Search提取候选框
- 类别:CNN提取特征+SVM分类
- 位置修正:LR
2、SPPnet:
3、Fast-CNN
4、Faster-CNN
5、YOLO
6、SSD
7、YOLO-v2
8、YOLO-v3
--------------------python代码实现-------------------------
import cv2
import matplotlib.pyplot as plt
# 展示图像,封装成函数
def cv_show_image(name, img):
cv2.imshow(name, img)
cv2.waitKey(0) # 等待时间,单位是毫秒,0代表任意键终止
cv2.destroyAllWindows()
# 读取彩色图像
img = cv2.imread('11.png')
part = img[0:300, 80:300]
a1=cv_show_image('naruto', part)
part = img[200:500, 280:500]
a2=cv_show_image('naruto', part)
# # 分割图像的三个通道
b, g, r = cv2.split(img)
a3=cv_show_image('gray image, only show B Channel', b) # 单一通道,就是灰色展示出来了
a4=cv_show_image('gray image, only show G Channel', g) # 单一通道,就是灰色展示出来了
a5=cv_show_image('gray image, only show R Channel', r) # 单一通道,就是灰色展示出来了
# 仅仅保留R通道
curr_img = img.copy()
curr_img[:, :, 0] = 0 # 擦掉B通道
curr_img[:, :, 1] = 0 # 擦掉G通道
a6=cv_show_image('colorful image, only keep R Channel data', curr_img) # 三个通道,显示彩色图像
# 仅仅保留G通道
curr_img = img.copy()
curr_img[:, :, 0] = 0 # 擦掉B通道
curr_img[:, :, 2] = 0 # 擦掉R通道
a7=cv_show_image('colorful image, only keep G Channel data', curr_img) # 三个通道,显示彩色图像
# 仅仅保留R通道
curr_img = img.copy()
curr_img[:, :, 1] = 0 # 擦掉G通道
curr_img[:, :, 2] = 0 # 擦掉R通道
a8=cv_show_image('colorful image, only keep B Channel data', curr_img) # 三个通道,显示彩色图像
img = cv2.imread('11.png')
cv2.imshow('img', img)
cv2.waitKey(0)
# 定义填充的四周的宽度
top_size, bottom_size, left_sze, right_size = (50, 50, 50, 50)
# 进行不同的边界填充
# 边界的像素值,重复填充
replicate = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_REPLICATE)
# 映射镜像,比如是 dcba|abcd|dcba
reflect = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_REFLECT)
# 映射镜像,比如是 dcb|abcd|cba
reflect101 = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_REFLECT101)
# 外包装法
wrap = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_WRAP)
# 常数来填充
content = cv2.copyMakeBorder(img, top_size, bottom_size, left_sze, right_size, borderType=cv2.BORDER_CONSTANT, value=0)
plt.subplot(231), plt.imshow(img, 'gray'), plt.title('original image')
plt.subplot(232), plt.imshow(replicate, 'gray'), plt.title('replicate padding image')
plt.subplot(233), plt.imshow(reflect, 'gray'), plt.title('reflect padding image')
plt.subplot(234), plt.imshow(reflect101, 'gray'), plt.title('reflect101 padding image')
plt.subplot(235), plt.imshow(wrap, 'gray'), plt.title('wrap padding image')
plt.subplot(236), plt.imshow(content, 'gray'), plt.title('content padding image')
plt.show()
代码二结果图:
--------------------------- C++ -------------------------------
来源
//************头文件包含*************
#include "stdafx.h"
#include
#include //包含opencv的头文件
//***********************************
//************命名空间***************
using namespace cv;//使用opencv命名空间
using namespace std;
//***********************************
//************主函数*****************
int main()
{
int c;
Mat img1 = imread("1.jpg");
Mat img2,img3,img4,img5;
img4 = img1.clone();//将img1图像复制到img4中,此复制连同数据区域一起复制
namedWindow("原图");//创建窗口
namedWindow("ROI区域图");//创建窗口
namedWindow("复制图");//创建窗口
while (1)
{
img2 = img1(Rect(200,200,100,100));//选取img1中从(200,200)到(300,300)的ROI区域
img5 = img1(Range(100,100+img2.rows),Range(100,100+img2.cols));//选取img1中从(100,100)开始与img2同样大小的ROI区域
img3 = img2.clone();//将img2图像复制到img3中,此复制连同数据区域一起复制
img3.copyTo(img5);//将img3图像复制到img5中,此时img1中相应的ROI区域数据也一起发生了变化
imshow("原图", img4);//显示图像
imshow("ROI区域图", img2);//ROI区域图像
imshow("复制图", img1);//显示合并后的图像
c = waitKey(0);//等待按键按下
if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
break;
}
return 0;
}