Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.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
Opencv 从C+中的R、G、B像素生成图像+;_Opencv - Fatal编程技术网

Opencv 从C+中的R、G、B像素生成图像+;

Opencv 从C+中的R、G、B像素生成图像+;,opencv,Opencv,我有以下代码: double R = (double)(img->imageData + img->widthStep*i)[j*3]; double G = (double)(img->imageData + img->widthStep*i)[j*3+1]; double B = (double)(img->imageData + img->widthStep*i)[j*3+2]; 然后我给R,G,B设置了一些条件。 现在我想在C++中

我有以下代码:

   double R = (double)(img->imageData + img->widthStep*i)[j*3];
   double G = (double)(img->imageData + img->widthStep*i)[j*3+1];
   double B = (double)(img->imageData + img->widthStep*i)[j*3+2];
然后我给R,G,B设置了一些条件。 现在我想在C++中从新的像素值R,G,B生成新的图像。
非常感谢你的帮助

您好,您应该看看:

#include "opencv2/opencv.hpp"
using namespace cv;

int main(int ac, char **av){

  cv::Mat src = cv::Mat(Size(1920, 1080), CV_8UC3, Scalar(0, 0, 0));
  std::vector<cv::Mat> rgbChannels;
  cv::cvtColor(src.clone(), src, CV_BGR2RGB);

  cv::split(src, rgbChannels);

  cv::Mat r = rgbChannels.at(0);
  cv::Mat g = rgbChannels.at(1);
  cv::Mat b = rgbChannels.at(2);
  unsigned char max1, max2, min1, min2, R=0,G=0,B=0;
  for (unsigned int y =0; y < r.rows; y++){
      for (unsigned int x =0; x < r.cols; x++){
          max1= (R>G)? R:G;
          max2 = (max1>B)? max1:B;
          min1= (R<G)? R:G;
          min2 = (min1<B)? min1:B;
          if( R>95 && G>40 && B> 20 && (max2-min2)>15 && (R-G)>15 && R>G && R>B) {
              r.at<uchar>(y, x)=R;
              g.at<uchar>(y, x)=G;
              b.at<uchar>(y, x)=B;
          }
      }
  }

  rgbChannels.clear();
  rgbChannels.push_back(r);
  rgbChannels.push_back(g);
  rgbChannels.push_back(b);
  cv::Mat RGBoutput;
  cv::merge(rgbChannels, RGBoutput);
  cv::imwrite("output.png", RGBoutput);
  return 0;
}
#包括“opencv2/opencv.hpp”
使用名称空间cv;
内部主(内部ac,字符**av){
cv::Mat src=cv::Mat(尺寸(19201080),cv_8UC3,标量(0,0,0));
std::矢量RGB通道;
cv::cvtColor(src.clone(),src,cv_BGR2RGB);
cv::分割(src、RGB通道);
cv::Mat r=rgbChannel.at(0);
cv::Mat g=rgbChannel.at(1);
cv::Mat b=RGB通道,位于(2);
无符号字符max1,max2,min1,min2,R=0,G=0,B=0;
for(无符号整数y=0;yG)?R:G;
max2=(max1>B)?max1:B;
min1=(R40&&B>20&&(max2-min2)>15&&&(R-G)>15&&R>G&&R>B){
r、 at(y,x)=r;
g、 at(y,x)=g;
b、 at(y,x)=b;
}
}
}
rgbcchannels.clear();
RGB通道。推回(r);
RGB通道。推回(g);
RGB通道。推回(b);
cv::Mat RGBoutput;
合并(RGB通道,RGBoutput);
cv::imwrite(“output.png”,RGBoutput);
返回0;
}

顺便说一下,如果您想对颜色进行操作,您应该查看HSV颜色空间以获得更精确的结果。

Hi。非常感谢你的回答。但在本例中,我希望显示来自摄影机的图像,然后更改一些值(R、G、B),并将这些像素设置为从摄影机接收的当前图像。我该怎么做呢?使用视频捕获和我给你的一段代码修改你的帧,并对修改后的帧进行cv::imshow。(在此处查看视频捕获:)hii。我想从你的代码中检测皮肤区域a/s:r=rgb通道。在(0);g=在(1)处的RGB信道;b=在(2)处的RGB信道;无符号字符max1,max2,min1,min2,R=0,G=0,B=0;对于(无符号整数y=0;yG)?r:G;max2=(max1>B)?max1:B;min1=(R40&&B>20&&(max2-min2)>15&&&(r-G)>15&&r>G&&r>B{r.at(y,x)=r;G.at(y,x)G;B.at(y,x)=B;}但合并后,图像不会改变任何内容。我正在查看您的pb。请给我几分钟时间。对不起,我忘记了Opencv默认使用BGR。我编辑了我的代码。