早期的RCNN目标检测算法中使用selective search算法来产生region proposals.
该算法的大致流程如下:
1、利用图分割算法将图像分成不同的区域,并为这些区域产生相应的包围框
2、计算包围框之间的相似度,相似度可以分为四个部分(颜色相似度、纹理相似度和大小,相交约束),合并相近的包围框
3、排除过大、过小、长宽比过大、过小的包围框即可
参考代码:https://github.com/tttanikawa/selective-search-cpp
#pragma once
#include
#include
#include
#include
#include
#include
#include
#include
test:
#include "selective_search.hpp"
#include
int main(int argc, char** argv) {
std::string fileName = "./deer.jpg";
cv::Mat img = cv::imread(fileName, cv::IMREAD_COLOR);
// selective search
auto proposals = ss::selectiveSearch(img, 500, 0.8, 50, 20000, 100000, 2.5);
// do something...
for (auto&& rect : proposals) {
cv::rectangle(img, rect, cv::Scalar(0, 255, 0), 3, 8);
}
cv::imwrite("./result.jpg", img);
cv::imshow("result", img);
cv::waitKey(0);
return 0;
}
makefile:
CC = g++
CFLAGS = -g -Wall
SRCS = test.cpp
PROG = test
all: $(PROG)
clean:
$(RM) $(PROG)
OPENCV = `pkg-config opencv --cflags --libs`
LIBS = $(OPENCV)
$(PROG):$(SRCS)
$(CC) $(CFLAGS) -o $(PROG) $(SRCS) $(LIBS)
图分割结果:
最后产生的包围框:
图分割和其他部分的耗时对比:
1158397: 815254