热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

yolov3+opencv+视频检测保存

目录1.opencv的安装1)去官网下载opencv2)解压下载下来的zip包3)安装必须库和cmake-gui4)

目录

1.opencv的安装

1)去官网下载opencv

2)解压下载下来的zip包

 3)安装必须库和cmake-gui

4)cmake-gui编译

5)make和make install

6)路径设置

7)测试一下:

2.yolov3源码更改与排错

Error1:cv_window_normal未定义

Error2:showimage参数不足

3.测试视频与保存

1)官方命令:

2)python为接口



1.opencv的安装

之前感觉太麻烦放弃了,检测图片直接保存,没用到。现在想检测视频,是避不开了,弄了我一天才安装好,之前一直make失败,后来发现opencv4.1.1不可用,又换3.4.2心累,结果配置好了,环境变量不生效,重启了傻逼电脑进不去系统,一直紫屏,呜呜,最后大神都放弃,帮我拯救了,重启了一下好了,不过进入系统会闪屏,而且垃圾箱不可用,不过能进就好,呜呜。

建议使用cmake-gui编译,容易发现问题。

1)去官网下载opencv

在本教程中选用的时opencv3.4.2,其他版本的配置方法其实差不多。 

   下载链接http://opencv.org/releases.html,选择sources版本

2)解压下载下来的zip包

unzip opencv-3.4.2.zip

 3)安装必须库和cmake-gui

sudo apt-get install cmake-gui
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff4.dev libswscale-dev libjasper-dev

库不全的话,后期cmake有问题再补

4)cmake-gui编译

进入到解压后的文件包中,在解压的文件夹里新建一个文件夹build用来编译OpenCV

中间cmake编译过程,参考博客https://blog.csdn.net/jindunwan7388/article/details/80397700和

 https://blog.csdn.net/u011897411/article/details/89743448

中间解决ippicv下载问题,离线下载

# 打开终端,输入gedit ~/DownLoad/opencv_source/opencv/3rdparty/ippicv/ippicv.cmake # 将47行的"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}ippicv/"# 改为手动下载的文件的本地路径(也就是将网络下载的模式改为本地文件下载的模式):"file:///path" #(根据文件路径填写,注意是///)

5)make和make install

我就是make卡住了

make -j8

出现的错误:

/usr/bin/ld: warning: libiconv.so.2, needed by //home/smiles/anaconda2/lib/libgobject-2.0.so.0, not found (try using -rpath or -rpath-link)
/usr/bin/ld: warning: libpcre.so.1, needed by //home/smiles/anaconda2/lib/libgobject-2.0.so.0, not found (try using -rpath or -rpath-link)
//home/smiles/anaconda2/lib/libglib-2.0.so.0:对‘libiconv_open’未定义的引用
//home/smiles/anaconda2/lib/libglib-2.0.so.0:对‘libiconv_close’未定义的引用
//home/smiles/anaconda2/lib/libglib-2.0.so.0:对‘libiconv’未定义的引用 

解决:参照博客https://blog.csdn.net/tsq292978891/article/details/78854188

把cmake编译中的python3改为anaconda下面,并把python的包的路径,都改成了anaconda3下面的路径。

make install

6)路径设置

参考对应版本(3或4)博客https://blog.csdn.net/jindunwan7388/article/details/80397700和

 https://blog.csdn.net/u011897411/article/details/89743448

7)测试一下:

# 命令行输入以下命令
pkg-config --modversion opencv

2.yolov3源码更改与排错

Error1:cv_window_normal未定义

终于知道这些错误原因了,是根据博客https://blog.csdn.net/babyzbb636/article/details/100534359更改,版本不同,把对应部分改成源码对应或者对应下面排错。

差点因为这个原因就放弃了,各种百度找不到,找到的也不适用,还怀疑opencv环境各种。

最后想起来看源码,看哪里错误,发现,它好像不识别的是这几个定义; 查了一下这个函数的用法,想到了可能是版本差异:改成如下就好了,记住一共两处修改 

Error2:showimage参数不足

showimage源码参数是两个,这个也是opencv版本不同,改成三个,第三参数为0, 把cvSetwindowproperty注释了,有需要的网友可以根据版本更改

 Make -j8 success天呀

3.测试视频与保存

1)官方命令:

./darknet detector demo cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_10000.weights test_video/video/video001.avi

其中只能显示最后的结果无法保存,或者使用

./darknet detector demo cfg/voc.data cfg/yolov3-voc.cfg backup/yolov3-voc_10000.weights test_video/video/video001.avi -prefix test_video/result/video001.mp4

最后是逐帧保存,也不太好,所以这里修改下源码:

1.在src/image.c里面修改show_image函数

int show_image(image p, const char *name, int ms)
{
#ifdef OPENCV// int c = show_image_cv(p, name, ms);// 增加保存结果视频int c = save_video(p, name, ms);return c;
#elsefprintf(stderr, "Not compiled with OpenCV, saving to %s.png instead\n", name);save_image(p, name);return -1;
#endif
}

2.在src/image_opencv.cpp里面增加一个save_video函数

int save_video(image im, const char*name, int ms)
{// 静态数据成员,第一次调用初始化,之后调用不会在初始化static VideoWriter* video;Mat m = image_to_mat(im);// imshow(name, m);{// 空视频对象则初始化一个对象if(video == NULL){const char* output_name = "test_video/result/video001.mp4"; //修改输出路径// 新建视频保存对象video = new VideoWriter(output_name, VideoWriter::fourcc('M','J','P','G'), 50, Size(im.w,im.h));printf("\n DST output_video = %s \n", output_name);}// 写入每一帧的处理结果video->write(m);printf("\n cvWriteFrame \n");}int c = waitKey(ms);if (c != -1) c = c%256;return c;
}

2)python为接口

参考文献:

https://blog.csdn.net/orDream/article/details/84311697

https://blog.csdn.net/dragongiri/article/details/90647089

https://blog.csdn.net/OliverkingLi/article/details/93487281

其中我把image.c和image.h的条件编译去掉了,否则老报libdarknet.so: undefined symbol: ndarray_to_image,可能我插入代码位置不对。终于实现了视频检测。

之前保存视频老打不开,在darknet.py的main中,贴出我修改后的代码(前面参照我贴出来的博客修改):

if __name__ == "__main__":net = load_net("/home/zbb/darknet/cfg/yolov3-voc.cfg".encode('utf-8'), "/home/zbb/darknet/backup/yolov3-voc_10000.weights".encode('utf-8'), 0)meta = load_meta("/home/zbb/darknet/cfg/voc.data".encode('utf-8'))in_path='/home/zbb/darknet/test_video/plane.MP4'#out_path='/home/zbb/darknet/test_video/result/test.avi'vid = cv2.VideoCapture(in_path)total_frames = vid.get(cv2.CAP_PROP_FRAME_COUNT)fps = vid.get(cv2.CAP_PROP_FPS)frame_size = (int(vid.get(cv2.CAP_PROP_FRAME_WIDTH)), int(vid.get(cv2.CAP_PROP_FRAME_HEIGHT)))fourcc = cv2.VideoWriter_fourcc(*"mp4v") #avi格式:*'XVID' mp4格式: *"mp4v"out_path = in_path.split(".")[0] + "-result.mp4"videoWriter = cv2.VideoWriter(out_path, fourcc, fps, frame_size)#videoWriter = cv2.VideoWriter('/home/zbb/darknet/test_video/result/test.avi', fourcc, 25, (720,404)) #改成自己的framesize或者用上面的写入while True:return_value,arr=vid.read()if not return_value:break im=nparray_to_image(arr)boxes= detect(net, meta, im)for i in range(len(boxes)):score=boxes[i][1]label=boxes[i][0]xmin=boxes[i][2][0]-boxes[i][2][2]/2ymin=boxes[i][2][1]-boxes[i][2][3]/2xmax=boxes[i][2][0]+boxes[i][2][2]/2ymax=boxes[i][2][1]+boxes[i][2][3]/2print(label)cv2.rectangle(arr,(int(xmin),int(ymin)),(int(xmax),int(ymax)),(0,255,0),2)cv2.putText(arr,str(label),(int(xmin),int(ymin)),fontFace=cv2.FONT_HERSHEY_SIMPLEX,fontScale=0.8,color=(0,255,255),thickness=2) cv2.imshow("Canvas", arr)videoWriter.write(arr) cv2.waitKey(1) cv2.destroyAllWindows()

现在存在问题是标签不对,有b’,看了detect也没有问题,简单去掉'


推荐阅读
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 使用Python在SAE上开发新浪微博应用的初步探索
    最近重新审视了新浪云平台(SAE)提供的服务,发现其已支持Python开发。本文将详细介绍如何利用Django框架构建一个简单的新浪微博应用,并分享开发过程中的关键步骤。 ... [详细]
  • python的交互模式怎么输出名文汉字[python常见问题]
    在命令行模式下敲命令python,就看到类似如下的一堆文本输出,然后就进入到Python交互模式,它的提示符是>>>,此时我们可以使用print() ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 本文详细介绍了如何使用Python编写爬虫程序,从豆瓣电影Top250页面抓取电影信息。文章涵盖了从基础的网页请求到处理反爬虫机制,再到多页数据抓取的全过程,并提供了完整的代码示例。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • 在Ubuntu 16.04 LTS上配置Qt Creator开发环境
    本文详细介绍了如何在Ubuntu 16.04 LTS系统中安装和配置Qt Creator,涵盖了从下载到安装的全过程,并提供了常见问题的解决方案。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • ImmutableX Poised to Pioneer Web3 Gaming Revolution
    ImmutableX is set to spearhead the evolution of Web3 gaming, with its innovative technologies and strategic partnerships driving significant advancements in the industry. ... [详细]
  • 本文详细介绍了macOS系统的核心组件,包括如何管理其安全特性——系统完整性保护(SIP),并探讨了不同版本的更新亮点。对于使用macOS系统的用户来说,了解这些信息有助于更好地管理和优化系统性能。 ... [详细]
  • 在使用 MUI 框架进行应用开发时,开发者常常会遇到 mui.init() 和 mui.plusReady() 这两个方法。本文将详细解释它们的区别及其在不同开发环境下的应用。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
author-avatar
ho世英雄
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有