我想将数据直接写入 IplImage 的 imageData 数组,但我找不到很多关于它是如何格式化的信息。让我特别烦恼的一件事是,尽管创建了具有三个通道的图像,但每个像素都有四个字节。
我用来创建图像的功能是:
IplImage *frame = cvCreateImage(cvSize(1, 1), IPL_DEPTH_8U, 3);
种种迹象表明,这应该会创建一个三通道 RGB 图像,但似乎并非如此。
例如,我将如何将单个红色像素写入该图像?
感谢您的帮助,这让我很难过。
我想将数据直接写入 IplImage 的 imageData 数组,但我找不到很多关于它是如何格式化的信息。让我特别烦恼的一件事是,尽管创建了具有三个通道的图像,但每个像素都有四个字节。
我用来创建图像的功能是:
IplImage *frame = cvCreateImage(cvSize(1, 1), IPL_DEPTH_8U, 3);
种种迹象表明,这应该会创建一个三通道 RGB 图像,但似乎并非如此。
例如,我将如何将单个红色像素写入该图像?
感谢您的帮助,这让我很难过。
如果您正在查看,frame->imageSize
请记住它是frame->height * frame->widthStep
,不是frame->height * frame->width
。
BGR 是 OpenCV 的原生格式,而不是 RGB。
此外,如果您刚刚开始,您应该考虑使用 C++ 接口(其中 Mat 替换 IplImage),因为这是未来的方向,并且使用起来更容易。
下面是一些直接访问像素数据的示例代码:
int main (int argc, const char * argv[]) {
IplImage *frame = cvCreateImage(cvSize(41, 41), IPL_DEPTH_8U, 3);
for( int y=0; y<frame->height; y++ ) {
uchar* ptr = (uchar*) ( frame->imageData + y * frame->widthStep );
for( int x=0; x<frame->width; x++ ) {
ptr[3*x+2] = 255; //Set red to max (BGR format)
}
}
cvNamedWindow("window", CV_WINDOW_AUTOSIZE);
cvShowImage("window", frame);
cvWaitKey(0);
cvReleaseImage(&frame);
cvDestroyWindow("window");
return 0;
}
直接回答您的问题,将像素涂成红色:
IplImage *frame = cvCreateImage(cvSize(1, 1), IPL_DEPTH_8U, 3);
int y,x;
x=0;y=0; //Pixel coordinates. Use this for bigger images than a single pixel.
int C=2; //0 for blue, 1 for green and 2 for red (BGR is the default format).
frame->imageData[y*frame->widthStep+3*x+C]=(uchar)255;
无符号字符* imageData = [r1, g1, b1, r2, g2, b2, ..., rN, bn, gn]; // n = 图像帧的高度*宽度->imageData = imageData.
将您的图像作为高度 N 和宽度 M 的维度数组,并将其排列成长度为 N*M 的行向量。为 IPL_DEPTH_8U 图像设置 unsigned char* 类型。