Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 只有三分之一的图像是用OpenCV编写的_C++_Opencv_Image Processing - Fatal编程技术网

C++ 只有三分之一的图像是用OpenCV编写的

C++ 只有三分之一的图像是用OpenCV编写的,c++,opencv,image-processing,C++,Opencv,Image Processing,在这段代码中,我试图将值(0.123,本例中为0.123)写入输出图像,输出图像是输入图像的副本。但由于某些原因,只有三分之一的图像正在被写入,而其他三分之二仍然是复制的输入图像,正如您在屏幕截图中看到的那样 我做错了什么 // image is of type CV_32FC3 and XYZ, values in range [0,1] Mat out = Mat::zeros(image.size(), image.type()); image.copyTo(out); for (int

在这段代码中,我试图将值(
0.123,本例中为
0.123)写入输出图像,输出图像是输入图像的副本。但由于某些原因,只有三分之一的图像正在被写入,而其他三分之二仍然是复制的输入图像,正如您在屏幕截图中看到的那样

我做错了什么

// image is of type CV_32FC3 and XYZ, values in range [0,1]
Mat out = Mat::zeros(image.size(), image.type());
image.copyTo(out);

for (int i = 0; i < out.rows; i++)
{
  for (int j = 0; j < out.cols; j++)
  {
    out.at<float>(i,j) = 0.123;
  }
}
//图像的类型为CV_32FC3和XYZ,值的范围为[0,1]
Mat out=Mat::零(image.size(),image.type());
image.copyTo(输出);
for(int i=0;i


PS:更大的目标是将HDR图像融合到输出图像中,这实际上是可行的,但仅适用于输出图像的左三分之一,与此处相同。

您需要更改此项:

out.at<float>(i,j) = 0.123;
out.at(i,j)=0.123;
为此:

out.at<cv::Vec3f>(i,j)[0] = 0.123;
out.at<cv::Vec3f>(i,j)[1] = 0.123;
out.at<cv::Vec3f>(i,j)[2] = 0.123;
out.at(i,j)[0]=0.123;
out.at(i,j)[1]=0.123;
out.at(i,j)[2]=0.123;

因为它是彩色图像,所以它有3个通道

如果您只是将数组设置为标量,则可以使用

out=标量(0.123,0.123,0.123)

out.setTo(标量(0.123,0.123,0.123))

这是一个3通道图像,但您使用float(用于访问灰度图像中的像素)进行访问,因此为1/3。 如果要使用for循环访问元素,请使用Vec3f

out.at(i,j)=cv::Vec3f(0.123,0.123,0.123)

您可以通过索引访问特定通道的元素

out.at<cv::Vec3f>(j,i)[0] = 0.123;
out.at<cv::Vec3f>(j,i)[1] = 0.123;
out.at<cv::Vec3f>(j,i)[2] = 0.123;
out.at(j,i)[0]=0.123;
out.at(j,i)[1]=0.123;
out.at(j,i)[2]=0.123;

谢谢你们两位,我原本以为我不需要
Vec3f
,因为我没有它的方式,HDR融合实际上适用于左三分之一,我认为这是其他错误。我也可能尝试了
Vec3b
而不是
Vec3f
,但没有注意到其他类型。可能您可以更改为for(int j=0;j<3*out.cols;j++)来处理整个图像,就像它有一个通道一样,但是不知道为什么要这样做:D如果你的代码不用于测试,你可以删除所有的循环并使用MatYeah的.setTo函数。setTo是将Mat设置为标量的更好选择。在答案中添加了这一点。