cvtcolor python opencv_Python环境下使用OpenCV Cuda编程

b8f94ac82c817fef3aa1649806044980.png

1、构建opencv_contrib模块,目录结构如下:

63c771396d99d6c63e12e35b534d3ab7.png

1.1 cuda2.hpp 内容如下:

#ifndef __OPENCV_CUDA2_HPP__
#define __OPENCV_CUDA2_HPP__
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
namespace cv
{
namespace cuda2
{
CV_EXPORTS_W void threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
CV_EXPORTS_W void resize(InputArray src, OutputArray dst, Size dsize, int interpolation=INTER_LINEAR);
CV_EXPORTS_W void cvtColor(InputArray src, OutputArray dst, int code);
CV_EXPORTS_W void absdiff(InputArray src1, InputArray src2, OutputArray dst);
}
}
#endif /* __OPENCV_CUDA2_HPP__ */

1.2 precomp.hpp 内容如下:

#ifndef __OPENCV_CUDA2_PRECOMP_HPP__
#define __OPENCV_CUDA2_PRECOMP_HPP__
#include "opencv2/core.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/cudaoptflow.hpp"
#include "opencv2/cudaarithm.hpp"
#include "opencv2/core/cuda.hpp"
#include "opencv2/cudaimgproc.hpp"
#include "opencv2/cudawarping.hpp"
#endif

1.3 cuda2.cpp 内容如下:

#include "precomp.hpp"
namespace cv
{
namespace cuda2
{
CV_EXPORTS_W void threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type)
{
cv::cuda::GpuMat d_src, d_dst;
d_src.upload(src);
cv::cuda::threshold(d_src, d_dst, thresh, maxval, type);
d_dst.download(dst);
}
CV_EXPORTS_W void resize(InputArray src, OutputArray dst, Size dsize, int interpolation=INTER_LINEAR)
{
cv::cuda::GpuMat d_src, d_dst;
d_src.upload(src);
cv::cuda::resize(d_src, d_dst, dsize, 0, 0, interpolation);
d_dst.download(dst);
}
CV_EXPORTS_W void cvtColor(InputArray src, OutputArray dst, int code)
{
cv::cuda::GpuMat d_src, d_dst;
d_src.upload(src);
cv::cuda::cvtColor(d_src, d_dst, code);
d_dst.download(dst);
}
CV_EXPORTS_W void absdiff(InputArray src1, InputArray src2, OutputArray dst)
{
cv::cuda::GpuMat d_src1, d_src2, d_dst;
d_src1.upload(src1);
d_src2.upload(src2);
cv::cuda::absdiff(d_src1, d_src2, d_dst);
d_dst.download(dst);
}
}
}

1.4 CMakeLists.txt 内容如下:

if(IOS OR WINRT OR (NOT HAVE_CUDA AND NOT BUILD_CUDA_STUBS))
ocv_module_disable(cuda2)
endif()
set(the_description "access opencv cuda methods from Python")
ocv_warnings_disable(CMAKE_CXX_FLAGS /wd4127 /wd4324 /wd4512 -Wundef -Wmissing-declarations -Wshadow)
ocv_define_module(cuda2 opencv_core opencv_imgproc opencv_tracking opencv_cudaoptflow opencv_cudaarithm opencv_cudaimgproc WRAP python)

2、参照上一篇文章《centos7下编译opencv3.4.8+cuda10版本》将上述cuda2模块一起编译进去,最后生成.so文件路径:

/data/User/XX/opencv_cuda/lib/python3.7/site-packages/cv2.cpython-37m-x86_64-linux-gnu.so

将该.so文件拷贝到你使用的python环境下:

/data/Packages/anaconda/data/lib/python3.7/site-packages/cv2/

目录结构如下:

3645b3edc34a25397204ac8b223369d1.png

2.1 __init__.py 内容为:

import importlib
from .cv2 import *
from .data import *
# wildcard import above does not import "private" variables like __version__
# this makes them available
globals().update(importlib.import_module('cv2.cv2').__dict__)

2.2 data文件夹的内容为opencv生成目录下

/data/User/XX/opencv_cuda/share/OpenCV/haarcascades/ 的文件拷贝过去即可

5b9757221412a711e46f895f7337571c.png

3、编译成功后,可以对自定义模块进行测试:

import cv2
import time
if __name__ == '__main__':
s = time.time()
img = cv2.imread("DR8A6268.jpg")
print("imread: ", time.time() - s)
s = time.time()
img1 = cv2.cuda2.resize(img, (3000, 4000))
print("resize: ", time.time() - s)
s = time.time()
img2 = cv2.cuda2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
print("cvtColor: ", time.time() - s)
s = time.time()
img3 = cv2.cuda2.threshold(img2, 128, 255, cv2.THRESH_BINARY)
print("threshold: ", time.time() - s)
s = time.time()
img4 = cv2.cuda2.absdiff(img2, img3)
print("absdiff: ", time.time() - s)
cv2.imwrite("4.png", img4)

测试原图为:

125ded4128f7be68dcba5af09d7dc07a.png

生成结果图为:

c6a5f09be67185a54259a07e262f0c42.png

4、以上测试成功,说明GPU能够顺利执行,但是实际测试的时候会发现,调用cuda后,执行时间并没有减少,这是因为执行函数在cpu与gpu之间数据拷贝的时间消耗较大,加上python调用c++代码上的时间消耗导致这种使用方式并不那么高效,所以一般在较为复杂的图像处理操作时,可采用这种方式进行加速。

08eb46d8f73388e41e3d3b49fee3e214.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值