Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 写入IplImage imageData_Image Processing_Opencv_Iplimage - Fatal编程技术网

Image processing 写入IplImage imageData

Image processing 写入IplImage imageData,image-processing,opencv,iplimage,Image Processing,Opencv,Iplimage,我想直接将数据写入IplImage的imageData数组,但是我找不到很多关于它是如何格式化的信息。有一件事特别困扰我,尽管创建了一个有三个通道的图像,但每个像素有四个字节 我用来创建图像的函数是: IplImage *frame = cvCreateImage(cvSize(1, 1), IPL_DEPTH_8U, 3); 根据所有指示,这应该会创建一个三通道RGB图像,但情况似乎并非如此 例如,我如何将单个红色像素写入该图像 谢谢你的帮助,这让我很难堪。无符号字符*图像数据=[r1,g1

我想直接将数据写入IplImage的imageData数组,但是我找不到很多关于它是如何格式化的信息。有一件事特别困扰我,尽管创建了一个有三个通道的图像,但每个像素有四个字节

我用来创建图像的函数是:

IplImage *frame = cvCreateImage(cvSize(1, 1), IPL_DEPTH_8U, 3);
根据所有指示,这应该会创建一个三通道RGB图像,但情况似乎并非如此

例如,我如何将单个红色像素写入该图像


谢谢你的帮助,这让我很难堪。

无符号字符*图像数据=[r1,g1,b1,r2,g2,b2,…,rN,bn,gn];//n=图像的高度*宽度 帧->图像数据=图像数据


取一个高N、宽M的多维数组,并将其排列成长度N*M的行向量。对于IPL_DEPTH_8U图像,将其设置为unsigned char*。

如果要查看
frame->imageSize
请记住它是
frame->height*frame->widthStep
,非
frame->height*frame->width

BGR是OpenCV的本机格式,而不是RGB

也,如果你刚刚开始,你应该考虑使用C++接口(其中垫替换IPLIGION),因为这是未来的方向,而且使用起来更容易。

下面是一些直接访问像素数据的示例代码:

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;
}
int main(int argc,const char*argv[]{
IplImage*frame=cvCreateImage(cvSize(41,41),IPL_DEPTH_8U,3);
对于(inty=0;yheight;y++){
uchar*ptr=(uchar*)(帧->图像数据+y*帧->宽度步长);
对于(intx=0;xwidth;x++){
ptr[3*x+2]=255;//将红色设置为最大值(BGR格式)
}
}
cvNamedWindow(“窗口”,CV_窗口_自动调整大小);
cvShowImage(“窗口”,框架);
cvWaitKey(0);
cvReleaseImage(&frame);
窗口(“窗口”);
返回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;

这个答案假设事实上每像素有三位。我已经确认我的图像的N通道是3,但每个像素仍然有4位。值得一提的是,它们实际上并没有按像素分组。它们似乎存储在每行的末尾,都设置为0。问题是每个像素有四个字节。额外的字节似乎被分组在每一行的末尾,并且都被设置为零,但我不知道为什么。另外,我不知道这是否重要,但图像似乎存储在BGR中,而不是RGB中。不确定额外的4个字节?你怎么看?无论如何,请尝试将imagedata分配给char*数组。这对我来说很有用。是的,一些C++库使用BGR,有些使用RGB。如果显示时颜色层看起来已切换,则使用CVTColor(frame,frame,CV_BRG2RGB)切换R层和B层。图像大小始终等于4*像素数。我只是通过打印imageData数组来找到位置,试图弄清楚数据是如何存储的。无论如何,我会试试的。谢谢你。我最终发现了这一点,但不幸的是,对于我在测试中使用的一行和两行像素,行舍入分别增加了一个和两个像素。我会看看mat,在浏览时,它似乎是一个更不透明的系统,但我想这只是缺乏熟悉。我不是OpenCV的世界权威,但我不认为mat比IplImage更不透明。和C++的铃声和口哨一样,操作符重载使得它更容易使用。文件载于