前言
使用傳統的圖像來檢測目標邊緣,受到干擾的因素太多了,而已魯棒性不高,同樣的參數,在這個環境下可以,換個環境就根本檢測不到物體的邊緣,或者把不是邊緣的也檢測進去了。ICCV2015有人提出了整體嵌套邊緣檢測,就通過深度學習模型執行圖像到圖像的預測。論文地址:https://arxiv.org/abs/1504.06375,github上的工程:https://github.com/s9xie/hed。這裏我使用opencv dnn與c++演示hed邊緣檢測的效果。
HED邊緣檢測
1.檢測代碼
void edgeDetection(cv::Mat &src,cv::Mat &dst,double threshold)
{
CV_DNN_REGISTER_LAYER_CLASS(Crop, CropLayer);
cv::Mat img = src.clone();
cv::Size reso(500, 500);
cv::Mat blob = cv::dnn::blobFromImage(img, threshold, reso, cv::Scalar(104.00698793, 116.66876762, 122.67891434), false, false);
cv::dnn::Net net = cv::dnn::readNet("model/deploy.prototxt", "model/hed.caffemodel");
net.setInput(blob);
cv::Mat out = net.forward();
cv::resize(out.reshape(1, reso.height), out, img.size());
cv::Mat out2;
out.convertTo(dst, CV_8UC3, 255);
}
int main(void)
{
cv::Mat src = cv::imread("1.jpg");
cv::namedWindow("原圖", 0);
cv::imshow("原圖", src);
resize(src, src, cv::Size(500, 500));
cv::Mat dst;
edgeDetection(src, dst,2.2);
cv::namedWindow("HED", 0);
cv::imshow("HED", dst);
cv::waitKey(0);
return 0;
}
2.運行效果
官網效果: