C++ 및 opencv는 픽셀 색상을 가져와 Mat로 설정합니다.
-
20-12-2019 - |
문제
cv::Mat 이미지의 일부 픽셀에 새로운 색상 값을 설정하려고 합니다. 내 코드는 다음과 같습니다.
Mat image = img;
for(int y=0;y<img.rows;y++)
{
for(int x=0;x<img.cols;x++)
{
Vec3b color = image.at<Vec3b>(Point(x,y));
if(color[0] > 150 && color[1] > 150 && color[2] > 150)
{
color[0] = 0;
color[1] = 0;
color[2] = 0;
cout << "Pixel >200 :" << x << "," << y << endl;
}
else
{
color.val[0] = 255;
color.val[1] = 255;
color.val[2] = 255;
}
}
imwrite("../images/imgopti"+to_string(i)+".tiff",image);
출력(cout 사용)에서는 좋은 픽셀을 얻는 것처럼 보이지만 출력 이미지(imwrite 사용)에서는 해당 픽셀이 수정되지 않습니다.나는 이미 color.val[0]을 사용해 보았습니다.출력 이미지의 픽셀 색상이 왜 변하지 않는지 아직도 알 수 없습니다.감사해요
해결책
새 픽셀 값을 이미지에 다시 복사하는 것을 제외한 모든 작업을 수행했습니다.
이 줄은 픽셀의 복사본을 로컬 변수로 가져옵니다.
Vec3b color = image.at<Vec3b>(Point(x,y));
그래서 바꾸고 나면 color
필요에 따라 다음과 같이 다시 설정하세요.
image.at<Vec3b>(Point(x,y)) = color;
전체적으로 다음과 같습니다.
Mat image = img;
for(int y=0;y<img.rows;y++)
{
for(int x=0;x<img.cols;x++)
{
// get pixel
Vec3b color = image.at<Vec3b>(Point(x,y));
// ... do something to the color ....
// set pixel
image.at<Vec3b>(Point(x,y)) = color;
}
}
다른 팁
참조를 사용하십시오.
Vec3b & color = image.at<Vec3b>(y,x);
color[2] = 13;
. 성능상의 이유로 사용하지 않습니다.
구조체 정의 :
//#pragma pack(push, 2) //not useful (see comments below)
struct RGB {
uchar blue;
uchar green;
uchar red; };
.
다음 CV :: MAT 이미지에서 다음과 같이 사용하십시오.
RGB& rgb = image.ptr<RGB>(y)[x];
.
image.ptr (y) 스캔 라인 Y에 대한 포인터를 제공합니다.x 및 y
의 루프가있는 픽셀을 반복합니다.제휴하지 않습니다 StackOverflow