제목이 명확하지 않을 수 있지만 다음 설명을주의 깊게 살펴보십시오. 미리 감사드립니다.Opencv obatin 특정 픽셀 마스크를 기반으로 한 RGB 값
은 내가 RGB 이미지와 바이너리 마스크 이미지가 있습니다
Mat img = imread("test.jpg")
Mat mask = Mat::zeros(img.rows, img.cols, CV_8U);
은, 마스크에 어떤 사람을 지정 사람의 수는이 좌표를 기반으로, N. 이제 제로가 아닌 좌표를 알고 가정을, 우리 확실히 원래 어 이미지의 대응하는 픽셀의 RGB 값을 얻을 수있는이 다음과 같은 코드에 의해 수행 될 수 알고
Mat colors = Mat::zeros(N, 3, CV_8U);
int counter = 0;
for (int i = 0; i < mask.rows; i++)
{
for (int j = 0; j < mask.cols; j++)
{
if (mask.at<uchar>(i, j) == 1)
{
colors.at<uchar>(counter, 0) = img.at<Vec3b>(i, j)[0];
colors.at<uchar>(counter, 1) = img.at<Vec3b>(i, j)[1];
colors.at<uchar>(counter, 2) = img.at<Vec3b>(i, j)[2];
counter++;
}
}
}
다음과 같은 좌표가 될 것이다 enter image description here
,617,그러나 for 루프의이 두 계층에는 너무 많은 시간이 걸립니다. 색상을 알아내는 더 빠른 방법이 있는지 궁금 해서요. 사람들이 제가 전달하려고 한 것을 이해할 수 있기를 바랍니다.
PS : 나는 파이썬을 사용할 수 있다면, 이것은 단지 한 문장으로 수행 할 수 있습니다 : 당신이 C++를 사용하는 다른 오픈 소스 라이브러리를 사용하여 유연 경우, Armadillo
을 시도
colors = img[mask == 1]
대상 '매트'는 좌표를 저장하지 않고 '입력'이미지의 픽셀 값을 '좌표'라고 부르는 이유는 무엇입니까? | 또한, 그 파이썬 코드가 정확하지, numpy 배열 호출 할 수 없습니다. 'img [mask == 1]'을 의미 했습니까? 또한 좌표 목록도 생성하지 않습니다. –
친절하게 상기시켜 주셔서 감사합니다 :) – Terry