استفاده از cuda در opencv - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

استفاده از cuda در opencv

0 امتیاز

سلام.

فرض کنید کد زیر را به صورت معمولی با opencv نوشتیم چطور باید به cuda تبدیلش کرد و آیا تبدیلش با OpenCL فرق داره؟

#include <iostream>
#include "opencv2/opencv.hpp"
int main ()
{
  cv::Mat img1 = cv::imread("images/cameraman.tif",0);
  cv::Mat result1;
  cv::equalizeHist(img1, result1);
  cv::imshow("Original Image ", img1);
  cv::imshow("Histogram Equalized Image", result1);
  cv::waitKey();
  return 0;
}

 

سوال شده خرداد 17, 1398  بوسیله ی Alias (امتیاز 302)   3 23 31

1 پاسخ

0 امتیاز
 
بهترین پاسخ
کلاس تصویر cv::cuda::GpuMat هستش .تصاویر برای پردازش باید از رم سیستم(host)  به حافظه (GPU (device منتقل بشن .
جهت انتقال تصویر به حافظه gpu از متد upload از کلاس GpuMat استفاده می کنیم 
جهت انتقال تصاویر از حافظه gpu به رم سیستم هم از متد download از کلاس GpuMat استفاده می کنیم
به صورت زیر:
 
#include <iostream>
#include "opencv2/opencv.hpp"
int main() {
	cv::Mat h_img1 = cv::imread("images/cameraman.tif", 0);
	cv::cuda::GpuMat d_img1, d_result1;
	d_img1.upload(h_img1);
	cv::cuda::equalizeHist(d_img1, d_result1);
	cv::Mat h_result1;  d_result1.download(h_result1)
		;  cv::imshow("Original Image ", h_img1);
	cv::imshow("Histogram Equalized Image", h_result1);
	cv::waitKey();
	return 0;
}

 

 
پاسخ داده شده خرداد 17, 1398 بوسیله ی مصطفی ساتکی (امتیاز 21,998)   24 34 75
انتخاب شد خرداد 20, 1398 بوسیله ی مصطفی ساتکی
شاید بد نباشه این رو به پاسختون اضافه کنید که در ابتدا نیاز هست که opencv شما با cuda به صورت manual کامپایل بشه. opencv در حالت پیشفرض از cuda پشتیبانی نمی کنه. opencv با cuda پرفرمنس خیلی خوبی تو اکثر موارد داره ولی مشکل اصلیش حجم dll و میزان بالا استفاده از RAM هست، به محض اولین استفاده از تابع upload برنامه حدود 500MB رم رو برای جلوگیری از paging رزرو میکنه که اگه پردازش قرار باشه multi-process انجام بشه میزان استفاده RAM اصلا بهینه نمیشه.
...