Opencv学习笔记blobFromImage函数、forward函数
以及网上对blobFromImage函数、forward函数讲解的很详细,但是对于输出的结果几乎没有介绍,所以很多时候再对于输出之后怎么处理让人比较困惑。
blobFromImage函数原型
1.blobFromImage(InputArray image,
2.double scalefactor=1.0,
3.const Size& size = Size(),
4.const Scalar& mean = Scalar(),
5.bool swapRB = false,
6.bool crop = false,
7.int ddepth = CV_32F)
image:这个就是我们将要输入神经网络进行处理或者分类的图片。
mean:需要将图片整体减去的平均值,如果我们需要对RGB图片的三个通道分别减去不同的值,那么可以使用3组平均值,如果只使用一组,那么就默认对三个通道减去一样的值。减去平均值(mean):为了消除同一场景下不同光照的图片,对我们最终的分类或者神经网络的影响,我们常常对图片的R、G、B通道的像素求一个平均值,然后将每个像素值减去我们的平均值,这样就可以得到像素之间的相对值,就可以排除光照的影响。
scalefactor:当我们将图片减去平均值之后,还可以对剩下的像素值进行一定的尺度缩放,它的默认值是1,如果希望减去平均像素之后的值,全部缩小一半,那么可以将scalefactor设为1/2。
size:这个参数是我们神经网络在训练的时候要求输入的图片尺寸。
swapRB:OpenCV中认为我们的图片通道顺序是BGR,但是我平均值假设的顺序是RGB,所以如果需要交换R和G,那么就要使swapRB=true
函数内的参数需要根据你训练的网络的相关参数调整。
blobFromImage函数输出
函数返回4D矩阵(没有定义行/列值,因此这些值为-1)。
Mat [ -1*-1*CV_32FC1, isCont=true, isSubmat=false, nativeObj=0xaa2fd0, dataAddr=0x18d93080 ]
对于返回值有疑问,参见opencv官方issues  github/opencv/opencv/issues/12520
forward函数原型
Mat cv::dnn::Net::forward(const String & outputName = String())
这个函数只需要提供layer的name即可;函数返回一个Mat变量,返回值是指输入的layername首次出现的输出。默认输出整个网络的运行结果。
还有其它三个重载,请参考:blog.csdn/qq_35054151/article/details/112487829、blog.csdn/WHU
_Kevin_Lin/article/details/108953227
对于返回结果的处理的参考代码1 - 目标识别:
1.Mat blob = blobFromImage(image, 1, Size(), Scalar(104, 117, 123));
2.
3.net.setInput(blob);
4.Mat detections = net.forward();
5.Mat detectionMat(detections.size[2], detections.size[3], CV_32F, detections.ptr<float>());
6.
7.for (int i = 0; i < ws; i++)
8.{
9.//自定义阈值
10.if (detectionMat.at<float>(i, 2) >= 0.14)
11.{
12.int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * ls);
13.int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * ws);
14.int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * ls);
15.writeline函数int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * ws);
16.
17.Rect object((int)xLeftBottom, (int)yLeftBottom,
18.(int)(xRightTop - xLeftBottom),
19.(int)(yRightTop - yLeftBottom));
20.
21.rectangle(image, object, Scalar(0, 255, 0));
22.}
23.}
对于返回结果的处理的参考代码2 - 语义分割:
1.Mat blob = OpenCvSharp.Dnn.CvDnn.BlobFromImage(frame, 1.0 / 255, new OpenCvSharp.Size(256, 256), new Scalar(), false, false);
2.net.SetInput(blob);
3.
4.Stopwatch sw = new Stopwatch();
5.sw.Start();
6.Mat prob = net.Forward(/*outNames[0]*/);
7.sw.Stop();
8.Console.WriteLine($'Runtime:{sw.ElapsedMilliseconds} ms');
9.
10.Mat p = prob.Reshape(1, prob.Size(2));
11.Mat res = new Mat(p.Size(), MatType.CV_8UC1, Scalar.All(255));
12.for(int h=0; h<p.Height; h++)
13.{
14.for (int w = 0; w < p.Width; w++)
15.{
16.res.Set<byte>(h, w, (byte)(p.At<float>(h, w) * 100));
17.}
18.}
对于返回结果的处理的参考代码3 - 目标分类1:
1.int main(int argc, char** argv)
2.{
3.Net net = readNetFromCaffe('C:/Users/xiaomao/Desktop/dnn/bvlc_googlenet.prototxt', 'C:/Users/xiaomao/Desktop/dnn/bvlc_googlenet.caffemodel');
4.Mat image = imread('C:/Users/xiaomao/Desktop/8.png');
5.Mat inputBlob = blobFromImage(image, 1, Size(224, 224), Scalar(104, 117, 123));
6.Mat prob;
7.cv::TickMeter t;
8.for (int i = 0; i < 10; i++)
9.{
10.CV_TRACE_REGION('forward');
11.net.setInput(inputBlob, 'data'); //set the network input
12.t.start();
13.prob = net.forward('prob'); //compute output
14.t.stop();
15.}
16.int classId;
17.double classProb;
18.getMaxClass(prob, &classId, &classProb);//find the best class
19.std::vector<String> classNames = readClassNames();
20.
21.string text = classNames.at(classId) + to_string(classProb * 100);
22.
23.putText(image, text, Point(5, 25), FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2);
24.
25.std::cout << 'Best class: #' << classId << ' '' << classNames.at(classId) << ''' << std::endl;
26.std::cout << 'Probability: ' << classProb * 100 << '%' << std::endl;
27.std::cout << 'Time: ' << (TimeMilli() / t.getCounter() << ' ms (average from ' << t.getCounter() << ' iterations)' << std::endl;
28.
29.imshow('Image', image);
30.waitKey(0);
31.//system('pause');
32.return 0;
33.}
对于返回结果的处理的参考代码3 - 目标分类2:
blog.csdn/bashendixie5/article/details/109705409

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。