将 vec3b 转换为 mat
Posted
技术标签:
【中文标题】将 vec3b 转换为 mat【英文标题】:Convert vec3b into mat 【发布时间】:2014-12-28 12:24:21 【问题描述】:我在im
中有彩色图像,我想使用 vec3b 使用以下代码获取 3 通道图像的像素值
for (int i = 0; i < im.rows; i++)
for (int j = 0; j < im.cols; j++)
for (int k = 0; k < nChannels; k++)
zay[k] = im.at<Vec3b>(i, j)[k]; //get the pixel value and assign to new vec3b variable zay
之后,我想将下面的 mat 3x3 过滤器与 zay 中的 vec3b 相乘
Filter= (Mat_<double>(3, 3) << 0, 0, 0,
0, 1, 0,
0, 0, 0);
如何 矩阵,以便我可以乘以 mat 过滤器? vec3b 是一个 3x1 的数组? 谢谢
【问题讨论】:
我猜手动计算会更容易更快(可能在宏/函数中): Vec3b temp; temp[0] = zay[0] * Filter.at根据您的示例,您尝试完成的操作称为与内核的卷积。
您可以设置内核并调用cv::filter2D()
为您应用它:
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
int main()
cv::Mat img = cv::imread("input.jpg");
if (img.empty())
std::cout << "!!! Failed to open input image" << std::endl;
return -1;
cv::Mat kernel = (cv::Mat_<float>(3, 3) << 0, 0, 0,
0, 1, 0,
0, 0, 0);
cv::Mat dst;
cv::filter2D(img, dst, -1, kernel, cv::Point(-1, -1), 0, cv::BORDER_DEFAULT);
cv::imshow("output", dst);
cv::waitKey(0);
return 0;
因此,无需迭代像素并自行执行计算。 OpenCV 文档解释了这一切:Making your own linear filters!。
【讨论】:
【参考方案2】:没有尝试,但应该可以:
cv::Mat DoubleMatFromVec3b(cv::Vec3b in)
cv::Mat mat(3,1, CV_64FC1);
mat.at <double>(0,0) = in [0];
mat.at <double>(1,0) = in [1];
mat.at <double>(2,0) = in [2];
return mat;
;
【讨论】:
我喜欢它。干净简单,+1。以上是关于将 vec3b 转换为 mat的主要内容,如果未能解决你的问题,请参考以下文章