发 帖  
原厂入驻New
发烧友10周年庆典,全网超值优惠来袭!千元现金券,下单抽奖赶紧参与》》
【Toybrick RK3399Pro AI开发板试用体验】opencv 识别可视范围的人类
2019-9-2 18:05:44  129
分享
本帖最后由 moonyuan 于 2019-9-3 00:48 编辑

在很多场合, 例如节能建筑 智能会议室 需要人走关灯
在传统的PIR红外识别,误触发/不触发概率高,使用摄像头识别比传统方式可靠
那么接下来实现利用opencv 识别当前可视范围的是否存在人类

首先加载caffe网络模型
  1. net = dnn::readNetFromCaffe("./MobileNetSSD_deploy.prototxt.txt", "./MobileNetSSD_deploy.caffemodel");
复制代码


读取图片 进行灰度转换,因为模型训练时 使用300*300,所以图片需要重新resize
  1. image = imread("messi.jpg");
  2.     Mat gray;
  3.     cvtColor(image,gray,CV_BGR2GRAY);
  4.     resize(gray, gray, Size(300, 300));
复制代码

将blob输入到网络,并向前推进,
  1.     Mat blob;
  2.     blob = blobFromImage(result,0.007843, Size(300, 300), 127.5);

  3.     net.setinput(blob);

  4.     Mat detections;
  5.     detections = net.forward();

  6.     Mat detectionMat(detections.size[2], detections.size[3], CV_32F, detections.ptr<float>());
  7.     for (int i = 0; i < detectionMat.rows; i++){
  8.         float confidence = detectionMat.at<float>(i, 2);
  9.         IF (confidence > 0.1){
  10.             size_t objectClass = (size_t)(detectionMat.at<float>(i, 1));

  11.             printf("n current image classification : %s, possible : %.2f\r\n", CLASSES[objectClass].c_str(), confidence);
  12.             
  13.             if((confidence <= 0.1) || strcmp("person",CLASSES[objectClass].c_str())){
  14.                
  15.                 continue;
  16.             }

  17.             int xLeftBottom = static_cast<int>(detectionMat.at<float>(i, 3) * gray.cols);
  18.             int yLeftBottom = static_cast<int>(detectionMat.at<float>(i, 4) * gray.rows);
  19.             int xRightTop = static_cast<int>(detectionMat.at<float>(i, 5) * gray.cols);
  20.             int yRightTop = static_cast<int>(detectionMat.at<float>(i, 6) * gray.rows);
  21.             
  22.             ostringstream ss;
  23.             ss << confidence;
  24.             String conf(ss.str());


  25.             Rect object((int)xLeftBottom, (int)yLeftBottom,
  26.             (int)(xRightTop - xLeftBottom),
  27.             (int)(yRightTop - yLeftBottom));


  28.             rectangle(result, object, Scalar(0, 255, 0));
  29.             String label = String(CLASSES[objectClass]) + ": " + conf;
  30.             int baseLine = 0;
  31.             Size labelSize = getTextSize(label, FONT_HERSHEY_SIMPLEX, 0.5, 1, &baseLine);
  32.             rectangle(result, Rect(Point(xLeftBottom, yLeftBottom - labelSize.height),
  33.             Size(labelSize.width, labelSize.height + baseLine)),
  34.             Scalar(255, 255, 255), CV_FILLED);
  35.             putText(result, label, Point(xLeftBottom, yLeftBottom),
  36.             FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 0, 0));
  37.         }
  38.     }
复制代码
最后把图像输出
  1. imshow("结果", result);
复制代码
我们看到图像的认为可以没独立识别出来

messi_res.jpg

再识别一下其他的图

messi.jpg

输出结果
res.jpg



结果都是能够识别到 94%以上的相似率,
后续经过修改定可以放到指定的场景稳定准确的工作



0
2019-9-2 18:05:44   评论 分享淘帖
1 个讨论
可以的哦  向大佬学习  看来瑞芯微这个板子还可以啊
2019-9-5 10:58:06 评论

举报

只有小组成员才能发言,加入小组>>

122个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /10 下一条

快速回复 返回顶部 返回列表