深圳餐饮网站建设甘肃做网站哪个平台好
web/
2025/10/2 2:26:12/
文章来源:
深圳餐饮网站建设,甘肃做网站哪个平台好,国外高校实验室网站建设成果,关键词分类工具一、实验目的
BMCV 提供了一套基于 Sophon AI 芯片优化的机器视觉库#xff0c;通过利用芯片的 TPU 和 VPP模块#xff0c;可以完成色彩空间转换、尺度变换、仿射变换、透射变换、线性变换、画框、JPEG 编解码、BASE64 编解码、NMS、排序、特征匹配等操作。
本实验的目的是…一、实验目的
BMCV 提供了一套基于 Sophon AI 芯片优化的机器视觉库通过利用芯片的 TPU 和 VPP模块可以完成色彩空间转换、尺度变换、仿射变换、透射变换、线性变换、画框、JPEG 编解码、BASE64 编解码、NMS、排序、特征匹配等操作。
本实验的目的是掌握算能的BMCV接口使用方法掌握bmcv_sobelbmcv_canny边缘检测函数的使用方法。
二、实验内容
基于套接字、多线程、同步锁机制实现多媒体文件的收发
发送端Ubuntu的PC机读取文件每1024个字节组成一个包通过TCP报文发送到接收端接收端SE5上启动2个线程线程1接收报文并将报文存入缓存线程2通过缓存读取报文存入文件中要求线程1和线程2之间通过同步锁进行线程同步。
编写代码通过OpenCV读取图片文件并调用BMCV的bmcv_sobel、bmcv_canny函数来实现对图片的边缘检测最后输出检测结果。直接利用OpenCV的边缘检测接口实现边缘检测功能对比OpenCV与BMCV边缘检测所需要的时间
三、开发环境
开发主机Ubuntu 22.04 LTS
硬件算能SE5
本地如果有SE5硬件则可以PC机作为客户端SE5作为服务器端。本地如果没有SE5硬件只有云空间则可以直接将客户端和服务器端都通过云空间实现机在云空间的SE5模拟环境中实现。
四、实验器材
开发主机 云平台
五、实验过程与结论
5.1 BMCV关键函数解析
请参考算能BMCV开发资料《BMCV User Guide》也可以通过以下网址下载
https://doc.sophgo.com/docs/2.7.0/docs_latest_release/bmcv/BMCV_User_Guide_zh.pdf
OpenCV的开发资料可参考《OpenCV官方文档》。
算能BMCV提供了bmcv_image_sobel和bmcv_image_canny函数用于进行边缘检测。
bmcv_image_sobel
bm_status_t bmcv_image_sobel (
bm_handle_t handle, //BMCV句柄
bm_image input, //输入的BMI图片待处理
bm_image output, //输出的BMI图片处理结果
int dx, //x 方向上的差分阶数
int dy) //y 方向上的差分阶数
具体函数接口说明如下 1第二个参数和第三个参数图像的格式为bm_imagebm_image 需要外部调用 bmcv_image_creat创建。image 内存可以使用 bm_image_alloc_dev_mem 或者 bm_image_copy_host_to_device来开辟新的内存或者使用 bmcv_image_attach 来 attach 已有的内存。 2dx, dy取值皆为1或0。 其中dx1dy0表示计算X方向的导数检测出的是垂直方向上的边缘dx0dy1表示计算Y方向的导数检测出的是垂直方向上的边缘。 3 Sobel 核的大小必须是-1,1,3,5 或7。其中特殊地如果是-1 则使用3×3 Scharr 滤波器如果是1 则使用3×1 或者1×3 的核。默认值为3。scale 为对求出的差分结果乘以的系数默认值为1。Delta为在输出最终结果之前加上该偏移量默认值为0。通常不需要对scale和Delta进行设置。 bmcv_image_canny
bm_status_t bmcv_image_canny (
bm_handle_t handle,
bm_image input,
bm_image output,
float threshold1,
float threshold2,
int aperture_size 3,
bool l2gradient false);
具体函数接口说明如下 1第二个参数和第三个参数图像的格式为bm_imagebm_image 需要外部调用 bmcv_image_create 创建。image 内存可以使用 bm_image_alloc_dev_mem 或者 bm_image_copy_host_to_device来开辟新的内存或者使用 bmcv_image_attach 来 attach 已有的内存。 2threshold1 和threshold2 为双阈值法的第一、第二个阈值。aperture_size 为 其中Sobel 核的大小目前仅支持3。l2gradient 表示是否使用L2 范数来求图像梯度, 默认值为false默认为由L1范数来求解图像梯度。 注意BMCV的函数接口都是基于BMI格式进行图像处理。如上面的函数说明其中第二个参数和第三个参数都是基于bm_image格式的。因此需要首先通过OpenCV读取图片并将图片格式转换为BMI格式后才可以调用bmcv_image_sobel和bmcv_image_canny函数进行边缘检测。 本实验及实验5实验6实验7中使用BMCV相关函数的基本处理流程如下图所示仅需调整红框模块中所调用的API即可实现不同实验功能 图4-1 实验流程框图
首先本实例为了利用BMCV接口需要引用相关的BMCV相关头文件
#include bmcv_api.h
创建Mat类对象并读取图片数据
# 创建OpenCV类对象
cv::Mat Input,Out;
# 读取第二个命令行参数存入mat对象中读取数据
Input cv::imread(argv[1], 0);
注意这里OpenCV类读取到的图片文件输出的格式是MAT格式而BMCV处理的图片是bm_image格式即BMCV对象。因此我们需要先创建BMCV对象然后将OpenCV类读取到的图片通过toBMI接口转换为BMCV对象。
# 创建BMCV对象
bm_image input, output;
bm_image_create(handle,height,width,FORMAT_GRAY,DATA_TYPE_EXT_1N_BYTE,input);
# 以下是c智能指针划分一块内存区域并获取其信息
std::unique_ptrunsigned char[] src_data(new unsigned char[width * height]);
std::unique_ptrunsigned char[] res_data(new unsigned char[width * height]);
BMCV对象操作要求在对象创建后需要为该对象申请内部管理内存。如下函数所示
bm_image_alloc_contiguous_mem(1, input);
bm_image_alloc_contiguous_mem(1, output);
也可以通过bm_image_alloc_dev_mem(input)函数申请内存
bm_image_alloc_dev_mem(input)
bm_image_alloc_dev_mem(output);
然后通过toBMI函数将OpenCV读取的图片mat类数据转化为BMCV类数据再调用bmcv_image_sobel函数进行处理
cv::bmcv::toBMI(Input,input);
# Sobel边缘检测
bmcv_image_sobel(handle, input, output, 0, 1)
需要注意的是这里用了toBMI函数实际内部做了一个内存同步的操作。也就是OpenCV读取的mat格式图片实际处于系统内存中通过toBMI转换后同步到设备内存中。这里也可以通过bm_image_copy_host_to_device函数完成内存的同步。具体见上述的《BMCV User Guide》110页中的示例代码所采用的方法。
将处理结果转化为mat数据格式保存
cv::bmcv::toMAT(output, Out);
cv::imwrite(out.jpg, Out);
销毁内存
bm_image_free_contiguous_mem(1, input);
bm_image_free_contiguous_mem(1, output);
bm_image_destroy(input);
bm_image_destroy(output);
bm_dev_free(handle);
综上我们可以得到利用BMCV sobel函数进行图像边缘检测的关键代码如下
#include iostream
#include vector
#include bmcv_api.h
#include common.h
#include stdio.h
#include stdlib.h
#include string.h
#include memoryusing namespace cv;
using namespace std;int main(int argc, char *argv[]) {
bm_handle_t handle; //获取句柄 bm_dev_request(handle, 0);int width 600; //定义图片数据 int height 600;cv::Mat Input,Out,Test; Input cv::imread(argv[1], 0); //opencv读取图片通过命令行参数传入// 智能指针获取分配内存数据 std::unique_ptrunsigned char[] src_data(new unsigned char[width * height]);std::unique_ptrunsigned char[] res_data(new unsigned char[width * height]);// bmcv处理 bm_image input, output;bm_image_create(handle,height,width,FORMAT_GRAY, DATA_TYPE_EXT_1N_BYTE,input);bm_image_alloc_contiguous_mem(1, input, 1); // 分配device memory unsigned char * input_img_data src_data.get();bm_image_copy_host_to_device(input, (void **)input_img_data);bm_image_create(handle,height,width,FORMAT_GRAY,DATA_TYPE_EXT_1N_BYTE,output);bm_image_alloc_contiguous_mem(1, output, 1); cv::bmcv::toBMI(Input,input); //自动进行内存同步// bmcv图像处理caif (BM_SUCCESS ! bmcv_image_sobel(handle, input, output, 0, 1)) {std::cout bmcv sobel error !!! std::endl;bm_image_destroy(input);bm_image_destroy(output);bm_dev_free(handle);return -1;}// 将输出结果转成mat数据并保存 cv::bmcv::toMAT(output, Out);cv::imwrite(out.jpg, Out);bm_image_free_contiguous_mem(1, input);bm_image_free_contiguous_mem(1, output);bm_image_destroy(input);bm_image_destroy(output);bm_dev_free(handle);return 0;
}
如果采用bmcv_image_canny函数进行边缘检测只需要将上述代码中的bmcv_image_sobel函数改为bmcv_image_canny函数即可
// bmcv图像处理canny
if (BM_SUCCESS ! bmcv_image_canny(handle, input, output, 0, 200)) {td::cout bmcv canny error !!! std::endl;bm_image_destroy(input);bm_image_destroy(output);bm_dev_free(handle);exit(-1);
}
编写makfile文件
DEBUG ? 0
PRODUCTFORM ? soc
BM_MEDIA_ION ? 0INSTALL_DIR ? release//注意这个地方一定要根据自己的目录路径进行设置
top_dir :../../..ifeq ($(PRODUCTFORM),x86) # pcie modeCROSS_CC_PREFIX x86_64-linux-
else # pcie_arm64 and soc modeCROSS_CC_PREFIX aarch64-linux-gnu-
endifCC $(CROSS_CC_PREFIX)gcc
CXX $(CROSS_CC_PREFIX)gCPPFLAGS : -stdgnu11 -fPIC -Wall -Wl,--fatal-warning
ifeq ($(DEBUG), 0)CPPFLAGS -O2
elseCPPFLAGS -g
endif# NATIVE API SDK
NATIVE_SDK_HEADERS:-I$(top_dir)/include/decode
NATIVE_SDK_LDFLAGS:-L$(top_dir)/lib/decode/${PRODUCTFORM}
NATIVE_SDK_LDLIBS :-lbmion -lbmjpulite -lbmjpuapi -lbmvpulite -lbmvpuapi -lbmvideo -lbmvppapi -lyuv# FFMPEG SDK
FF_SDK_HEADERS : -I$(top_dir)/include/ffmpeg
FF_SDK_LDFLAGS : -L$(top_dir)/lib/ffmpeg/$(PRODUCTFORM)
FF_SDK_LDLIBS : -lavcodec -lavformat -lavutil -lswresample -lswscale# OpenCV SDK
OCV_SDK_HEADERS : -I$(top_dir)/include/opencv/opencv4
OCV_SDK_LDFLAGS : -L$(top_dir)/lib/opencv/$(PRODUCTFORM)
OCV_SDK_LDLIBS : -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -lopencv_videoio# BMCV SDK
BMCV_SDK_HEADERS : -I$(top_dir)/include/bmlib
BMCV_SDK_LDFLAGS : -L$(top_dir)/lib/bmnn/$(PRODUCTFORM)
ifeq (${PRODUCTFORM}, x86)
BMCV_SDK_LDFLAGS : -L$(top_dir)/lib/bmnn/pcie
endif
BMCV_SDK_LDLIBS : -lbmcv -lbmlibCPPFLAGS $(NATIVE_SDK_HEADERS) $(FF_SDK_HEADERS) $(OCV_SDK_HEADERS) $(BMCV_SDK_HEADERS)
LDFLAGS : $(NATIVE_SDK_LDFLAGS) $(FF_SDK_LDFLAGS) $(OCV_SDK_LDFLAGS)LDLIBS : $(NATIVE_SDK_LDLIBS) $(FF_SDK_LDLIBS) $(OCV_SDK_LDLIBS) $(BMCV_SDK_LDLIBS) -lpthread -lstdcTARGETbmcv_sobel
MAKEFILEMakefile
ALLOBJS*.o
ALLDEPS*.dep
RMrm -rf
CPcp -fSOURCES : bmcv_sobel.cppOBJECTPATHS:$(patsubst %.cpp,%.o,$(SOURCES)).phony: all cleanall: $(TARGET)$(TARGET): $(OBJECTPATHS)$(CC) -o $ $(OBJECTPATHS) $(LDFLAGS) $(LDLIBS)install: $(TARGET)install -d $(INSTALL_DIR)/bininstall $(TARGET) $(INSTALL_DIR)/binuninstall:$(RM) $(INSTALL_DIR)/bin/$(TARGET) clean:$(RM) $(TARGET)$(RM) $(ALLDEPS)$(RM) $(ALLOBJS)bmcv_sobel.o : bmcv_sobel.cpp $(MAKEFILE)$(CXX) $(CPPFLAGS) -c $ -o $ -MD -MF $(:.o.dep)
LDLIBS : $(NATIVE_SDK_LDLIBS) $(FF_SDK_LDLIBS) $(OCV_SDK_LDLIBS) $(BMCV_SDK_LDLIBS) -lpthread -lstdcTARGETbmcv_sobel
MAKEFILEMakefile
ALLOBJS*.o
ALLDEPS*.dep
RMrm -rf
CPcp -fSOURCES : bmcv_sobel.cppOBJECTPATHS:$(patsubst %.cpp,%.o,$(SOURCES)).phony: all cleanall: $(TARGET)$(TARGET): $(OBJECTPATHS)$(CC) -o $ $(OBJECTPATHS) $(LDFLAGS) $(LDLIBS)install: $(TARGET)install -d $(INSTALL_DIR)/bininstall $(TARGET) $(INSTALL_DIR)/binuninstall:$(RM) $(INSTALL_DIR)/bin/$(TARGET) clean:$(RM) $(TARGET)$(RM) $(ALLDEPS)$(RM) $(ALLOBJS)bmcv_sobel.o : bmcv_sobel.cpp $(MAKEFILE)$(CXX) $(CPPFLAGS) -c $ -o $ -MD -MF $(:.o.dep)
5.2 BMCV执行结果
向云平台或SE5上传待检测的图片并执行如下代码
./bmcv_sobel greycat.jpeg bmcv 运行程序后对同一张图片进行处理所得出的sobel和canny边缘检测的两个结果
Sobel Canny 如上图所示两种边缘检测都能大概检测出图像边缘但精细程度不同。在实际应用时可选择自己所适合的方式选择合适的边缘检测方式。
5.3 OpenCV关键函数解析
OpenCV也提供了Sobel和Canny边缘检测算子具体函数原型如下
void cv::Canny(InputArray image,OutputArray edges,double threshold1,double threshold2,int apertureSize 3,bool L2gradient false
)void cv::Sobel(InputArray src,OutputArray dst, //输出图像与输入图像src具有相同的尺寸和通道数数据类型由第三个参数ddepth控制。int ddepth, // ddepth输出图像的数据类型深度, 为-1时输出图像的数据类型自动选择。int dx,int dy,int ksize 3,double scale 1,double delta 0,int borderType BORDER_DEFAULT) //像素外推法选择标志默认为//BORDER_DEFAULT表示不包含边界值倒序填充。同名参数的含义与BMCV中参数含义相同。OpenCV下不需要进行BMI转换直接可以将读取到的MAT格式的图片通过sobel 和Canny接口进行处理。如下图所示
//头文件
#include opencv2/core.hpp
#include opencv2/imgcodecs.hpp
#include opencv2/imgproc/imgproc.hpp
#include opencv2/highgui/highgui.hpp
....
//关键代码
cv::Mat srcImage cv::imread(argv[1], 1);
cv::Mat grayImage;
cv::Mat srcImage1 srcImage.clone();
cvtColor(srcImage, grayImage, COLOR_BGR2GRAY);
Mat dstImage, edge;
dstImage.create(srcImage1.size(), srcImage1.type());
dstImage Scalar::all(0);
srcImage1.copyTo(dstImage, edge);
5.4 硬件加速性能对比
此外在算能云平台上基于BMCV的sobel函数因为使用了硬件加速所以可以提升速率。
为验证执行程序所需的时间须在运行时通过time命令来实现如下图所示 第一张图为用OpenCV的sobel函数所需时间第二张图为用bmcv的sobel函数时所需的时间。经硬件加速后程序所需的运行时间明显减少。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/85376.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!