gpt4 book ai didi

C++:OpenCV:快速像素迭代

转载 作者:可可西里 更新时间:2023-11-01 14:54:50 25 4
gpt4 key购买 nike

我正在尝试从流式网络摄像头图像中获取 BGR 值。我遇到了内存访问冲突,因为我没有在嵌套的 for 循环中正确使用指针,但我不知道语法应该是什么。我找不到对我正在尝试执行的看似基本的任务足够具体的文档。

除了解决内存访问冲突之外,我还希望能够即时编辑每个像素,而不必进行深层复制,但也不知道他的语法应该是什么。

这是我目前的代码:

int main(int argc, char** argv)
{

int c;
Mat img;
VideoCapture capture(0);
namedWindow("mainWin", CV_WINDOW_AUTOSIZE);
bool readOk = true;

while (capture.isOpened()) {

readOk = capture.read(img);

// make sure we grabbed the frame successfully
if (!readOk) {
std::cout << "No frame" << std::endl;
break;
}

int nChannels = img.channels();
int nRows = img.rows;
int nCols = img.cols * nChannels;

if (img.isContinuous())
{
nCols *= nRows;
nRows = 1;
}

int i, j;
uchar r, g, b;
for (i = 0; i < nRows; ++i)
{
for (j = 0; j < nCols; ++j)
{
r = img.ptr<uchar>(i)[nChannels*j + 2];
g = img.ptr<uchar>(i)[nChannels*j + 1];
b = img.ptr<uchar>(i)[nChannels*j + 0];
}
}

if (!img.empty()) imshow("mainWin", img);
c = waitKey(10);
if (c == 27)
break;
}
}

最佳答案

您的扫描循环不正确。您应该只获取指向该行的指针每行一次。由于像素是 3 个字节的量,因此最容易将它们视为 Vec3b。

你应该有类似的东西

    uchar r, g, b;
for (int i = 0; i < img.rows; ++i)
{
cv::Vec3b* pixel = img.ptr<cv::Vec3b>(i); // point to first pixel in row
for (int j = 0; j < img.cols; ++j)
{
r = pixel[j][2];
g = pixel[j][1];
b = pixel[j][0];
}
}

    uchar r, g, b;
for (int i = 0; i < img.rows; ++i)
{
uchar* pixel = img.ptr<uchar>(i); // point to first color in row
for (int j = 0; j < img.cols; ++j)
{
b = *pixel++;
g = *pixel++;
r = *pixel++;
}
}

注意

很常见的是 Mat::at() 用于按顺序访问像素,例如:

    // DON'T DO THIS!
uchar r, g, b;
for (int i = 0; i < img.rows; ++i)
{
for (int j = 0; j < img.cols; ++j)
{
cv::Vec3b pixel = img.at<cv::Vec3b>(i, j);
r = pixel[2];
g = pixel[1];
b = pixel[0];
}
}

但是这样的使用是不合适的。对于每个像素访问,at() 需要通过将行号和行长度相乘来计算索引 - 在整个图像上,计算可能会导致处理时间比上面的代码慢得多(其中ptr() 每行进行一次等效计算。此外,在 Debug模式下,at() 有一个断言,使其再次变慢。

如果您确定行之间没有填充,则可以通过消除对 ptr() 的调用来加快速度。在这种情况下,上面第二个循环中的像素指针将在每行结束后指向下一行的开始。但是,如果您的垫子是其他垫子的某个感兴趣区域,那将不起作用。

另一方面,如果您以随机方式访问像素,而不是像上面那样按顺序扫描,则 at() 非常合适。

关于C++:OpenCV:快速像素迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25221421/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com