在 OpenCV Mat 图像中显示 Vec3b 像素值
Show Vec3b pixel values in OpenCV Mat image
我想知道 Mat 图像中 Vec3b 像素的值。
我不是真正的 OpenCV expert.My Vec3b 是,如果我打印 Vec3b :
Vec3b centralIntensity;
cx=70; cy=700;
centralIntensity = (Vec3b)imgTemp->at<Vec3b>(cx, cy);
cout<<"I:["<<cx<<","<<cy<<"]="<<centralIntensity<<endl;
我得到:
I:[70,700]=[150, 162, 160]
如果我打印单个值:
cout<<"***Uchar:["<<cx<<","<<cy<<"]="<<int(centralIntensity[0])<<","<<int(centralIntensity[1])<<","<<int(centralIntensity[2])<<endl;
我得到:
Uchar:[70,700]=127,0,0
我注意到如果我改变坐标,最后的打印总是一样的。
由于我必须比较不同通道上的强度像素,这样做并了解 BGR 通道中的像素值的好方法是什么?
***EDIT1:这就是我创建 Mat 图像的方式(我已经有一个 Mat imgIn 作为输入)并且我以另一种方式显示 Vec3b:
Mat *imgTemp;
uchar cblue, blue, cgreen;
imgTemp = new Mat(imgIn->size(), CV_8UC3);
imgIn->convertTo(*imgTemp, CV_8UC3);
Vec3b centralIntensity;
centralIntensity = (Vec3b)imgTemp->at<Vec3b>(cx, cy);
cout<<"I:["<<cx<<","<<cy<<"]="<<centralIntensity<<endl;
centralIntensity[0] = cblue;
centralIntensity[1] = cgreen;
centralIntensity[2] = cred;
cout<<"I:["<<cx<<","<<cy<<"]="<<centralIntensity<<endl;
cout<<"***Uchar:["<<cx<<","<<cy<<"]="<<int(centralIntensity[0])<<","<<int(centralIntensity[1])<<","<<int(centralIntensity[2])<<endl;
cout<<"***Uchar:["<<cx<<","<<cy<<"]="<<int(cblue)<<","<<int(cgreen)<<","<<int(cred)<<endl;
我得到:
I:[70,700]=[150, 162, 160]
***Uchar:[70,700]=127,0,0
***Uchar:[70,700]=127,0,0
如果我改变坐标?
I:[300,400]=[109, 123, 105]
***Uchar:[300,400]=127,0,0
***Uchar:[300,400]=127,0,0
对于Vec3b,可以这样实现,
Mat image = imread("img_Path");
for(int y=0;y<img.rows;y++)
{
for(int x=0;x<img.cols;x++)
{
// get pixel
Vec3b color = image.at<Vec3b>(x, y);
//color.val[0] // B
//color.val[1] // G
//color.val[2] // R
}
}
您正在用未初始化的值 cblue
、cred
、cgreen
覆盖 centralIntensity
,其中将包含 随机 值.
只需更正作业:
cblue = centralIntensity[0];
cgreen = centralIntensity[1];
cred = centralIntensity[2];
我想知道 Mat 图像中 Vec3b 像素的值。 我不是真正的 OpenCV expert.My Vec3b 是,如果我打印 Vec3b :
Vec3b centralIntensity;
cx=70; cy=700;
centralIntensity = (Vec3b)imgTemp->at<Vec3b>(cx, cy);
cout<<"I:["<<cx<<","<<cy<<"]="<<centralIntensity<<endl;
我得到:
I:[70,700]=[150, 162, 160]
如果我打印单个值:
cout<<"***Uchar:["<<cx<<","<<cy<<"]="<<int(centralIntensity[0])<<","<<int(centralIntensity[1])<<","<<int(centralIntensity[2])<<endl;
我得到:
Uchar:[70,700]=127,0,0
我注意到如果我改变坐标,最后的打印总是一样的。 由于我必须比较不同通道上的强度像素,这样做并了解 BGR 通道中的像素值的好方法是什么?
***EDIT1:这就是我创建 Mat 图像的方式(我已经有一个 Mat imgIn 作为输入)并且我以另一种方式显示 Vec3b:
Mat *imgTemp;
uchar cblue, blue, cgreen;
imgTemp = new Mat(imgIn->size(), CV_8UC3);
imgIn->convertTo(*imgTemp, CV_8UC3);
Vec3b centralIntensity;
centralIntensity = (Vec3b)imgTemp->at<Vec3b>(cx, cy);
cout<<"I:["<<cx<<","<<cy<<"]="<<centralIntensity<<endl;
centralIntensity[0] = cblue;
centralIntensity[1] = cgreen;
centralIntensity[2] = cred;
cout<<"I:["<<cx<<","<<cy<<"]="<<centralIntensity<<endl;
cout<<"***Uchar:["<<cx<<","<<cy<<"]="<<int(centralIntensity[0])<<","<<int(centralIntensity[1])<<","<<int(centralIntensity[2])<<endl;
cout<<"***Uchar:["<<cx<<","<<cy<<"]="<<int(cblue)<<","<<int(cgreen)<<","<<int(cred)<<endl;
我得到:
I:[70,700]=[150, 162, 160]
***Uchar:[70,700]=127,0,0
***Uchar:[70,700]=127,0,0
如果我改变坐标?
I:[300,400]=[109, 123, 105]
***Uchar:[300,400]=127,0,0
***Uchar:[300,400]=127,0,0
对于Vec3b,可以这样实现,
Mat image = imread("img_Path"); for(int y=0;y<img.rows;y++) { for(int x=0;x<img.cols;x++) { // get pixel Vec3b color = image.at<Vec3b>(x, y); //color.val[0] // B //color.val[1] // G //color.val[2] // R } }
您正在用未初始化的值 cblue
、cred
、cgreen
覆盖 centralIntensity
,其中将包含 随机 值.
只需更正作业:
cblue = centralIntensity[0];
cgreen = centralIntensity[1];
cred = centralIntensity[2];