문제

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

의 루프가있는 픽셀을 반복합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top