關於opencv遍歷畫素速度的提高方案

2021-08-14 19:46:23 字數 954 閱讀 1755

1、

二值化演算法經過測試後基本可以,但是在運動中會出現無法檢測特徵影象的地方,另外執行的速度還是不快。因為**中有兩個雙層巢狀的for迴圈,這是給遍歷影象用的。為了優化for迴圈遍歷畫素占用的時間,我的實驗過程如下:

我在網上查詢到可以用opencv 的lut查表法來簡化遍歷畫素的時間,這個可以比指標快,後來經過閱讀了一定網上的資料,才發現利用lut必須知道原影象與目標影象畫素的對應才能實現。

#pragma omp parallel for:這裡用到了openmp:就是在對應的for迴圈前加上#pragma,同時開啟openmp支援.

建議:把迴圈次數多的放在記憶體可以減少**執行的時間。

c:parallel_for:這裡用到了intel tbb的並行開發原理,就是在使用這個函式來實現for迴圈的時候,它可以將for迴圈分給幾個核心來處理,可以大大減少程式執行的時間。但是在我配置好的之後,我做了一下測試,發現不用parallel_for程式執行的時間反而更短,但是cpu的佔用率確實100%,這是我百思不得其解.

在查詢了大量的文獻之後,我發現了乙個大問題,更具opencv的官方answer顯示,parallel_for是serial loop,而parallel_for_才是真正的parallel loop。

在程式設計的過程中,我為了檢驗parallel_for_的迴圈次數是否正確,我在迴圈中加入了count++;結果令我感到詫異的是,count的值竟然和我給的迴圈次數不一樣。在這個難題上,我花費了大量的時間來查詢原因。在經過一定的研究後,我發現了問題:在並行開發中,有多個核心來執行count++的語句,但由於速度過快,導致當count被放乙個核到累加器a中的時候,另乙個核也要用這個變數,這就出現了問題,問題的現象目前是count的累加次數減少,具體問題還待研究。

驗證:為了驗證e的結論是否正確,你可以在你的count++的前後加乙個程序鎖將多核轉變為單核,你會發現結果的正確性。

時間匆忙**以後補上

opencv遍歷畫素的方式

1.使用at i,j mat類提供了乙個at的方法用於取得影象上的點,它是乙個模板函式,可以取到任何型別的影象上的點。一般typename用uchar表示灰度,vec3b表示彩色圖。2.使用指標來遍歷 更高效比第乙個 通過image.ptr i 取出第i行的指標 值得說明的是 程式中將三通道的資料轉...

opencv遍歷畫素的方式

我們在實際應用中對影象進行的操作,往往並不是將影象作為乙個整體進行操作,而是對影象中的所有點或特殊點進行運算,所以遍歷影象就顯得很重要,如何高效的遍歷影象是乙個很值得 的問題。mat類提供了乙個at的方法用於取得影象上的點,它是乙個模板函式,可以取到任何型別的影象上的點。下面我們通過乙個影象處理中的...

opencv關於畫素操作的彙總2

任何影象處理演算法,都是從操作每個畫素開始的。即使你不會使用opencv提供的各種影象處理函式,只要你了解影象處理演算法的基本原理,也可以寫出具有相同功能的程式。在opencv中,提供了種訪問每個畫素的方法 使用at方法 使用迭代器 使用指標。這三種方法在訪問速度上略有差異。debug模式下,這種差...