たぶん私は十分に一生懸命探していませんが、すべてが私に配列を使用することを望んでいるようです。したがって、fooが次のようなものである場合、fooの特定のピクセルのチャネル値を取得するにはどうすればよいMat foo = imread("bar.png")
ですか?
180878 次
3 に答える
108
タイプがCV_8UC3であると仮定すると、次のようになります。
for(int i = 0; i < foo.rows; i++)
{
for(int j = 0; j < foo.cols; j++)
{
Vec3b bgrPixel = foo.at<Vec3b>(i, j);
// do something with BGR values...
}
}
これがVec3bのドキュメントです。お役に立てば幸いです。また、OpenCVはRGBではなくBGRとして内部に物事を保存することを忘れないでください。
編集:
パフォーマンス上の理由から、ピクセル値を処理するためにデータバッファへの直接アクセスを使用することをお勧めします。
これについては、次のようになります。
uint8_t* pixelPtr = (uint8_t*)foo.data;
int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;
for(int i = 0; i < foo.rows; i++)
{
for(int j = 0; j < foo.cols; j++)
{
bgrPixel.val[0] = pixelPtr[i*foo.cols*cn + j*cn + 0]; // B
bgrPixel.val[1] = pixelPtr[i*foo.cols*cn + j*cn + 1]; // G
bgrPixel.val[2] = pixelPtr[i*foo.cols*cn + j*cn + 2]; // R
// do something with BGR values...
}
}
または代わりに:
int cn = foo.channels();
Scalar_<uint8_t> bgrPixel;
for(int i = 0; i < foo.rows; i++)
{
uint8_t* rowPtr = foo.row(i);
for(int j = 0; j < foo.cols; j++)
{
bgrPixel.val[0] = rowPtr[j*cn + 0]; // B
bgrPixel.val[1] = rowPtr[j*cn + 1]; // G
bgrPixel.val[2] = rowPtr[j*cn + 2]; // R
// do something with BGR values...
}
}
于 2011-10-26T13:08:55.203 に答える
16
以下のコードは、ピクセル値へのアクセスと変更の両方で機能します。
ピクセルのチャネル値にアクセスする場合:
for (int i = 0; i < image.cols; i++) {
for (int j = 0; j < image.rows; j++) {
Vec3b intensity = image.at<Vec3b>(j, i);
for(int k = 0; k < image.channels(); k++) {
uchar col = intensity.val[k];
}
}
}
チャネルのピクセル値を変更するには:
uchar pixValue;
for (int i = 0; i < image.cols; i++) {
for (int j = 0; j < image.rows; j++) {
Vec3b &intensity = image.at<Vec3b>(j, i);
for(int k = 0; k < image.channels(); k++) {
// calculate pixValue
intensity.val[k] = pixValue;
}
}
}
`
ソース:ピクセル値へのアクセス
于 2013-05-21T14:27:14.050 に答える
0
ピクセル配列は、cv::Matの「data」属性に格納されます。各ピクセルが3バイト(CV_8UC3)であるMat行列があると仮定します。
この例では、100x50の位置にREDピクセルを描画してみましょう。
Mat foo;
int x=100, y=50;
解決策1:
配列からピクセルを取得するマクロ関数を作成します。
#define PIXEL(frame, W, x, y) (frame+(y)*3*(W)+(x)*3)
//...
unsigned char * p = PIXEL(foo.data, foo.rols, x, y);
p[0] = 0; // B
p[1] = 0; // G
p[2] = 255; // R
解決策2:解決策2:
メソッドptrを使用してピクセルを取得します。
unsigned char * p = foo.ptr(y, x); // Y first, X after
p[0] = 0; // B
p[1] = 0; // G
p[2] = 255; // R
于 2017-11-17T03:39:23.177 に答える