2013-10-05 57 views
1

出於性能原因,我在C中使用OpenCV作爲圖像處理工具。在使用Open CV時,我發現Open CV對矩陣操作的庫支持較少。例如,如果想要將列向量添加到矩陣中的每一列,我將不得不編寫一個自定義函數來執行此操作。還有更多的操作在Matlab中看起來微不足道,在Open CV中缺失 - 像每列的規範,列明智的最小/最大等等。簡而言之,矩陣中的所有列操作似乎都在Open CV中缺失(我會感到驚訝如果我沒有找到更多)。圖書館的矩陣操縱支持是非常小的。這是一個圖書館的設計決定,還是有某種擴展可以幫助我完成這個任務。我相信肯定還有其他人對缺乏支持進行了觀察和處理。任何指針?openCV中的矩陣操作

回答

2

OpenCV可能不是MatLab的完整替代品,但其矩陣支持仍然相當不錯。你可能會發現你正在尋找的一些功能在那裏,但只是有不同的名字。

例如,如果想要將列向量添加到矩陣中的每一列,我將不得不編寫一個自定義函數來執行此操作。

您可以通過幾種方法來做到這一點;可能最簡單的是用範圍。請參閱下面的解決方案。

像每一列

使用矩陣範圍選擇在一個循環中每個列的範數:

cv::Mat m; 

// ... 

for (unsigned c = 0; c < m.cols(); c++) 
{ 
    cv::Mat col(m, cv::Range::all(), cv::Range(c, c+1)); 
    double n = cv::norm(col, NORM_L2); 
} 

逐列的最小/最大等

cv::reduce函數提供了所有這些功能:

cv::reduce(InputArray src, OutputArray dst, int dim, int rtype); 
// where rtype = CV_REDUCE_MIN, CV_REDUCE_MAX, etc 

在一個矩陣總之一切逐列操作似乎打開CV失蹤(我會感到驚訝,如果我沒有找到更多)。

cv::reduce()也執行總和和平均值。您可以選擇按列或按行執行。如果這些操作不足以滿足您的需求,您可能需要編寫自己的功能。

在線文檔是相當不錯的:

本教程對內存管理和矩陣更多的信息,尤其是解釋有關範圍和如何可以共享內存:

+0

我在C編寫代碼,而不是C++,這樣我就可以移植到嵌入式平臺。你有指向C文檔的指針嗎?你的答案仍然給我一個想法如何解決這個問題。謝謝 – Malice

+0

C API對應於OpenCV 1.x,而2.x是向C++的遷移。一些API仍然存在於C語言中,所以通常你可以把命名空間和函數名連接起來,所以(例如)使用'cv :: reduce',給出'cvReduce'。但總的來說,C++(或Python)是一條可行的路線,文檔將列出上述參考文獻中支持的所有綁定。您定位的是哪個平臺?無論如何,大多數人都有C++支持。 – gavinb

+1

@Malice如果你堅持使用舊版API,你實際上沒有權利抱怨缺乏功能。轉到http://docs.opencv.org/modules/core/doc/old_basic_structures.html,然後在索引中查找C函數。當然,使用C++的OpenCV可以移植到許多嵌入式平臺上,這是你不能用Matlab獲得的功能。 – Bull