opencv访问CV_32FC3 BGR CV::Mat的颜色元素
opencv accessing color element of CV_32FC3 BGR cv::Mat
我有一种问题。我看到了一些更相似的问题,但我找不到解决办法。
我的问题是我有一个CV_32FC3 CV::Mat,其中的值存储在0到255之间,我们称之为s.
我必须创建一个矩阵,称为p,其中存储所有像素的BGR值。
因此,p的行数应为S像素的总元素数,列数应为通道数(3)。
这就是我试图做的:
int n_pixels = S.cols * S.rows;
p = Mat::zeros(n_pixels, 3, CV_32FC1);
for(int i=0; i<n_pixels; i++) {
Scalar pixel = S.at<Scalar>(i); // i've tried also Vec3f, Point3_, etc..
p.at<float>(i,0) = pixel[0];
p.at<float>(i,1) = pixel[1];
p.at<float>(i,2) = pixel[2];
}
我也尝试过像这样的低级c-api数据访问:
for(int i=0; i<selection.rows; i++) {
p.at<float>(i,0) = S.ptr<float>(i)[0];
p.at<float>(i,1) = S.ptr<float>(i)[1];
p.at<float>(i,2) = S.ptr<float>(i)[2];
}
以及分割通道(但分割通道类型为CV_8U,所以我认为这是错误的):
vector<Mat> bgr;
cv::split(S, bgr);
for(int i=0; i<n_pixels; i++) {
p.at<float>(i,0) = bgr[0].data[i];
p.at<float>(i,1) = bgr[1].data[i];
p.at<float>(i,2) = bgr[2].data[i];
}
但每次我都会得到非常奇怪的结果,如果定制像素,比如:
172.2042 0.0000 0.0000
2771.1414 0.0000 0.0000
2939505920.0000 3.3468 0.0000
3079446986752.0000 0.0129 0.0000
192669347217408.0000 0.8367 0.0000
51956177323392237568.0000 16301891256320.0000 0.0509
58314208864123224064.0000 3.3945 0.0029
180449.1406 0.0000 0.0000
0.6531 0.0000 0.0000
0.0100 0.0000 0.0000
2.7373 0.0000 0.0000
10957.3184 0.0000 0.0000
739729604608.0000 3.3778 0.0000
0.0000 0.0000 0.0000
0.0000 0.0000 0.0000
0.0000 0.0000 0.0000
0.0000 0.0000 0.0000
而且,在某些情况下,也会出现segfault。。
有什么欺骗行为吗?如何解决?为什么我的审判是错误的?
编辑:我认为问题是数据类型转换
for(int row = 0; row < resiz.rows; ++row) {
float* p = resiz.ptr<float>(row);
for(int col = 0; col < resiz.cols; ++col,p+=3) {
p[0]=; p[1]=; p[2]=;
}
}
我认为您访问矩阵元素的方式不对。
S.at<Scalar>(i);
与相同
S.at<Scalar>(Point(i,0));
但是您需要提供x
和y
坐标。
对我来说,这段代码给出了预期的结果:
for(int i=0; i<n_pixels; i++)
{
Vec3f pixel = S.at<Vec3f>(i/S.cols, i%S.cols);
p.at<float>(i,0) = pixel[0];
p.at<float>(i,1) = pixel[1];
p.at<float>(i,2) = pixel[2];
}
相关文章:
- 将CHW格式的浮点向量转换为cv::Mat
- C++:从GPU内存(cudaMemcpy2D)获取BGR图像(cv::Mat)
- 选择基于另一个垫子的非零像素的cv::Mat的一部分?
- 将 cv::mat 转换为 QImage
- 将 cv::Mat 转换为 std::vector 的通用函数
- 在 QML VideoOutput 中将 cv::mat 显示为 QVideoFrame
- 如何将 cv::Mat 转换为 vtkImageData?
- 如何将 vtkImageData 转换为 cv::Mat?
- 如何总结所有cv::Mat元素
- Qt-工作线程崩溃时将cv::Mat转换为QImage
- 在 cv::Mat 中生成 2D 坐标网格
- 将 cv::Mat 转换为无符号的 int 像素
- OpenCV 分段错误(核心转储)在使用 cv::Mat::at 时
- 如何将多个 cv::Mat 从 c++ dll 传递到 opencvsharp Mat c#?
- 如何在不复制数据的情况下将 cv::Mat 转换为 2d 标准::矢量
- 如何使用 (*mpORBextractorLeft)(im,cv::Mat(),mvKeys,mDescriptors)
- 从数组创建 Mat 时,'cv::Mat' 和 'int' 类型不兼容
- 如何将 cv::mat 对象从 python 模块传递到 c++ 函数并返回返回的 cv::mat 类型为对象?
- 移动语义和 cv::Mat
- OpenCV 错误:断言在 cv::Mat 行 522 中失败