模型和测试文件:https://wwu.lanzoub.com/i1BJx01rr38h
c++的demo网上到处都有,抄一个C#的demo
因为没有视频,换了张图片把代码改成识别图片了,自己根据需要切换注释
using OpenCvSharp;
using OpenCvSharp.Dnn;
using System;
public class dnn_ssd_video_mobilenet
{
const int width = 300;
const int height = 300;
const float meanVal = 127.5f;
const float scaleFactor = 0.007843f;
string[] classNames = new string[] { "background",
"aeroplane", "bicycle", "bird", "boat",
"bottle", "bus", "car", "cat", "chair",
"cow", "diningtable", "dog", "horse",
"motorbike", "person", "pottedplant",
"sheep", "sofa", "train", "tvmonitor" };
String modelFile = "G:/SourceCode/MobileNetSSD_deploy.caffemodel";
String model_text_file = "G:/SourceCode/MobileNetSSD_deploy.prototxt";
string srcPath = @"G:\images\";
public void Run()
{
string imagefile = srcPath + "vehicle_test.jpg";
//VideoCapture capture = new VideoCapture(0);
//int w = capture.FrameWidth;
//int h = capture.FrameHeight;
//Cv2.NamedWindow("input", WindowFlags.AutoSize);
// set up net
Net net = Net.ReadNetFromCaffe(model_text_file, modelFile);
Mat frame;
//while (capture.Read(frame))
frame = Cv2.ImRead(imagefile);
{
//Cv2.ImShow("input", frame);
// 预测
Mat inputblob = CvDnn.BlobFromImage(frame, scaleFactor, new Size(width, height), meanVal, false);
net.SetInput(inputblob, "data");
Mat detection = net.Forward("detection_out");
//检测
Mat detectionMat = new Mat(detection.Size(2), detection.Size(3), MatType.CV_32F, detection.Ptr(0));
float confidence_threshold = 0.3f;
for (int i = 0; i < detectionMat.Rows; i++)
{
float confidence = detectionMat.At<float>(i, 2);
if (confidence > confidence_threshold)
{
int objIndex = (int)(detectionMat.At<float>(i, 1));
float tl_x = detectionMat.At<float>(i, 3) * frame.Cols;
float tl_y = detectionMat.At<float>(i, 4) * frame.Rows;
float br_x = detectionMat.At<float>(i, 5) * frame.Cols;
float br_y = detectionMat.At<float>(i, 6) * frame.Rows;
Rect object_box = new Rect((int)tl_x, (int)tl_y, (int)(br_x - tl_x), (int)(br_y - tl_y));
Cv2.Rectangle(frame, object_box, new Scalar(0, 0, 255), 2, LineTypes.Link8, 0);
Cv2.PutText(frame, classNames[objIndex], new Point(tl_x, tl_y), HersheyFonts.HersheySimplex, 1.0, new Scalar(255, 0, 0), 2);
}
}
Cv2.ImShow("ssd-video-demo", frame);
//int c = Cv2.WaitKey(5);
//if (c == 27)
//{ // ESC退出
// break;
//}
Cv2.WaitKey(0);
Cv2.DestroyAllWindows();
}
}
}
附学习路径:
这个就是一个c++描述的教程我用C#重写了demo方便学习,内附B站视频链接
https://wwa.lanzoub.com/i57Mf01lygzi
匹配视频:OpenCV4 C++ 快速入门视频30讲 - 系列合集_哔哩哔哩_bilibili
https://wwa.lanzoub.com/iDFsp01p3d8b
匹配视频: https://www.bilibili.com/video/BV1QW411F7e7?p=24