我知道如何使用Vec3b
訪問三個通道cv::Mat
。但現在我有一個n
頻道cv::Mat
和n
是不恆定的(使用cv::Vec<uchar, n>
)。我現在如何訪問cv::Mat
頻道?如何在opencv中訪問Mat的第n個通道?
3
A
回答
2
比方說n = 10
,我們想要訪問像素(i, j)
的4th
頻道。這裏有一個簡單的例子:
typedef cv::Vec<uchar, 10> Vec10b;
// ....
// Create the mat
cv::Mat_<Vec10b> some_mat;
// Access 4th channel
uchar value = some_mat.at<Vec10b>(i,j)(4);
// or
uchar value = some_mat.at<Vec10b>(i,j)[4];
希望這可以幫助你。注意你可以省略typedef
這一行,我只是覺得這樣更容易。
0
爲了能夠處理任意數量的通道,您可以使用cv::Mat::ptr
和一些指針算術。
例如,僅支持CV_8U
數據類型將是如下一個簡單的方法:
#include <opencv2/opencv.hpp>
#include <cstdint>
#include <iostream>
inline uint8_t get_value(cv::Mat const& img, int32_t row, int32_t col, int32_t channel)
{
CV_DbgAssert(channel < img.channels());
uint8_t const* pixel_ptr(img.ptr(row, col));
uint8_t const* value_ptr(pixel_ptr + channel);
return *value_ptr;
}
void test(uint32_t channel_count)
{
cv::Mat img(128, 128, CV_8UC(channel_count));
cv::randu(img, 0, 256);
for (int32_t i(0); i < img.channels(); ++i) {
std::cout << i << ":" << get_value(img, 32, 32, i) << "\n";
}
}
int main()
{
for (uint32_t i(1); i < 10; ++i) {
test(i);
}
return 0;
}
相關問題
- 1. 訪問OpenCV Mat中的多個通道
- 2. 使用OpenCV多通道沿通道方向訪問像素Mat
- 3. 如何訪問一個單行的元素在OpenCv中的Mat?
- 4. OpenCV Mat類:訪問多通道矩陣的元素
- 5. 在OpenCV中訪問Mat的像素
- 6. 如何在2通道Mat中使用OpenCV中的SVM?
- 7. OpenCV訪問MAT對象中的RGB值
- 8. 訪問Java中的OpenCV Mat元素
- 9. OpenCV Mat對象的訪問值UINT16
- 10. 如何在PHP中訪問數組中的第N個元素
- 11. 使用Mat OpenCV訪問像素
- 12. 訪問OpenCV中的每個獨立通道
- 13. OpenCV(C++)多通道元素訪問
- 14. OpenCV StereoSGBM mat輸出陣列在Xcode中的訪問不良
- 15. 在OpenCV中訪問複雜Mat的元素
- 16. 加載OpenCV :: mat圖像與opengl紋理中的alpha通道
- 17. 如何訪問NSString中的第n個字符?
- 18. OpenCV mat * image =(mat *)image
- 19. 如何在OpenCV中將3乘3單通道Mat轉換爲1乘3 3通道數組?
- 20. 訪問OpenCV中的多維Mat的子矩陣
- 21. 如何將Mat的一行復制到OpenCv中的另一個Mat的列中?
- 22. 在Haskell列表中訪問列表中的第n個元素
- 23. 將uchar Mat轉換爲OpenCV中的Mat?
- 24. 訪問python中的第n維
- 25. 在opencv中獲取cv :: Mat
- 26. MAT通道的平均值
- 27. 如何訪問3D CV的索引:: Mat
- 28. 在o(1)中訪問數組的第n個索引
- 29. 訪問XML的第n個元素在PHP中使用SimpleXML
- 30. 如何訪問另一個列表中每個列表的第n個元素?
@DimChtz的答案是完美的,你也可以使用'.toList()'你的墊子和訪問要素。 –
使用['cv :: Mat :: ptr'](http://docs.opencv.org/3.1.0/d3/d63/classcv_1_1Mat.html#a47ead5654d6577e63a3e154b57976a36)。 –
@RickM。我認爲你正在和Java混合起來。 C++ API中沒有這樣的東西。你提到的答案遠非完美,因爲它要求硬編碼的通道數 - 所以它完全無法解決問題。 –