我在两台不同的计算机上运行以下代码,第一台有 Nvidia GPU Quadro FX 880M,第二台是 Quadro FX 1000M(在 VS2010 中编译,opencv242,64bit;opencv 是从源代码编译的)。 我正在运行的代码如下:
int n = 1000; //number of iterations
int t = CV_TM_CCORR_NORMED; //correlation type
//reset GPU, print device info
cv::gpu::printCudaDeviceInfo(cv::gpu::getDevice());
cv::gpu::resetDevice();
//read big image
cv::Mat imgA = cv::imread("img.bmp" ,CV_LOAD_IMAGE_GRAYSCALE);
//read small, template image
cv::Mat imgB = cv::imread("tmplt.bmp",CV_LOAD_IMAGE_GRAYSCALE);
//upload images to GPU
cv::gpu::GpuMat imgA_GPU,imgB_GPU;
imgA_GPU.upload(imgA);
imgB_GPU.upload(imgB);
cv::gpu::GpuMat imgC_GPU; //correlation results, computer in GPU
cv::Mat imgC_CPU; //correlation results, computer in CPU
//matchTemplate in GPU, print average time(mSec)
size_t t1 = clock();
for(int i = 0;i!=n;++i)
cv::gpu::matchTemplate(imgA_GPU , imgB_GPU, imgC_GPU , t);
std::cout << "GPU: " <<
(double(clock())-t1)/CLOCKS_PER_SEC*1000.0/n <<std::endl;
//matchTemplate in CPU, print average time(mSec)
size_t t2 = clock();
for(int i = 0;i!=n;++i)
cv:: matchTemplate(imgA , imgB , imgC_CPU , t);
std::cout << "CPU: " <<
(double(clock())-t2)/CLOCKS_PER_SEC*1000.0/n <<std::endl;
//download GPU image to host
cv::Mat imgC_GPUhost;
imgC_GPU.download(imgC_GPUhost);
//convert images to 8U
imgC_CPU.convertTo(imgC_CPU,CV_8U,255);
imgC_GPUhost.convertTo(imgC_GPUhost,CV_8U,255);
//!!!!!! imgC_GPUhost should be equal to imgC_CPU
cv::Mat diff;
cv::absdiff(imgC_CPU,imgC_GPUhost,diff);
//expected: RESULTS DIFF: 0
std::cout << "RESULTS DIFF: " << cv::sum(diff).val[0] << std::endl;
cv::imwrite("cor2.bmp",imgC_CPU);
cv::imwrite("cor.bmp",imgC_GPUhost);
char s;
std::cin >> s;
有两件事让我很困惑:
在 Quadro FX 880M 上,此功能不起作用:GPU 输出图像 (imgC_GPU) 全为零 - 输入类型(8U 或 32F)或相关方法(ccor、ccoef 等)无关紧要. 另一方面,在 Quadro FX 1000M 中,我在 CPU 和 GPU 之间获得了一致的结果。怎么会这样,我需要做什么才能让它在 Quadro FX 880M 上运行?
在模板匹配中,输出图像中的每个像素都可以独立于其他像素进行计算 - 因此并行很容易,并且 GPU 实现非常适合。怎么可能,即使查看平均时间(如代码所示),GPU 性能也比 CPU 慢 3 倍?它在两台计算机上都得到了验证,没有其他进程在后台运行。
奥哈德
最佳答案
matchTemplate 的 GPU 版本似乎是在考虑同时搜索多个模板的情况下开发的。事实上,对于一个图像/一个模板,CPU 版本似乎更快。
http://answers.opencv.org/question/16061/opencv-matchtemplate-cuda-large-images-templates/
关于c++ - opencv matchTemplate 在计算机之间给出不一致的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13397617/
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我