[英]Reading data cv::Mat
我正在尋找一種更好的方法來從cv::Mat 32F3C
獲取數據,我使用的是: Vec3f c1 = _image.at<Vec3f>(i,j);
它工作正常,但不是很快,我看到這種方法更好:
Vec3f c1(_image.data[step[0]*i + step[1]*j + 0],_image.data[step[0]*i + step[1]*j + 1],_image.data[step[0]*i + step[1]*j + 2]);
它可以編譯,但是不正確,我也嘗試過這個:
Vec3f c1(_image.data[step*i + channels*j + 0],_image.data[step*i + channels*j + 1],_image.data[step*i + channels*j + 2]);
但同樣的事情,它可以編譯,但給了我另一個荒謬的結果。
我一定缺少一個因素。
謝謝 !
您可以超越at()函數調用並直接訪問的數據。 使用cv :: Mat :: ptr( http://docs.opencv.org/modules/core/doc/basic_structures.html )獲取指向圖像每行第一元素的指針。 接下來,您可以使用array [index] -operator訪問該行中的所有元素。
圖像數據在內存中大部分時間是連續的,但並不總是連續的(考慮在另一個cv :: Mat中選擇感興趣的區域)。 您可以在此處找到一個示例: OpenCV C ++:如何通過uchar數據指針訪問像素值CV_32F 。 圖像行是連續的,這就是為什么您在每次迭代中都要求一個指向第一個元素的指針,然后可以安全地訪問其他元素的原因。
您可能會在OpenCV文檔中找到這篇文章很有用。 但是,如果很明顯我必須精確地優化源代碼的那一部分,那么我將首先編寫易於理解的代碼,然后對其進行優化。
本文的要旨是,有三種訪問像素的方法:
動態地址計算:
const cv::Vec3f& pixel = img.at< cv::Vec3f >(y, x)
迭代器:
cv::MatIterator< cv::Vec3f > it=img.begin(), end=img.end(); for ( ; it != end ; ++it ) (*it)[0] = (*it)[1]
指針:
cv::Vec3f* pixel_ptr; for (int y = 0; y < img.rows; ++y) { pixel_ptr = img.ptr<cv::Vec3f>(y); for (int x = 0; x < img.cols; ++x) { (*pixel_ptr)[0] = (*pixel_ptr)[1] ++pixel_ptr; } }
基於高效的方式
cv::Mat _image = something;
for(int y = 0; y < _image.rows; ++y)
{
cv::Vec3f* _image_row = _image.ptr<cv::Vec3f>(y);
for(int x = 0; x< _image.cols; ++x)
{
cout << _image_row[x] << " ";
}
cout << endl;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.