0

我有一个关于使用图像宽度和宽度步长的问题。

我将尺寸和图像数据作为 QByteArray。我也有宽度步。我的问题是如何使用 widthstep 正确填充 Ipl 图像,因为我的图像宽度是 4095,它不是 8 的整数倍。我已经成功填充了宽度为 8 整数倍的图像,但现在我被困住了手头的问题。任何使用 widthstep 填充 IplImage 的通用代码都将受到欢迎和高度赞赏。:D

这是我的开关盒中起作用的部分;8 图像宽度的默认整数倍:

default:
      {
          IplImage* extracted_sar_image; // our image declaration
          CvSize size; // size type has width and height attributes
          size.height = sar_nrows_integer; // height of size
          size.width = sar_ncols_integer;

          extracted_sar_image = cvCreateImageHeader(size, IPL_DEPTH_8U, 1);
          extracted_sar_image->imageData = sar_image_data_2.data();         

          cvNamedWindow("Image", CV_WINDOW_NORMAL );
          cvShowImage("Image", extracted_sar_image); 
          cvMoveWindow("Image", 100, 100);
          cvSaveImage("C:/Users/z_slant/Desktop/generated_extracted_sar_image.bmp", extracted_sar_image); 
          // delay to observe the image that is being saved
          cvWaitKey(10000); 
          // deallocates the image data
          cvReleaseImage(&extracted_sar_image); 
          // closes image display window
          cvDestroyWindow("Image"); 

      break;
      }
4

1 回答 1

1

您必须考虑 openCV 结构中的字节对齐。

openCV IplImage 中的 1 行是 widthStep 字节长

QbyteArray 中的 1 行是宽度字节长

因此,逐行复制数据应该没问题。

qByteArray myArray;
IplImage* extracted_sar_image; // our image declaration
CvSize size; // size type has width and height attributes
size.height = sar_nrows_integer; // height of size
size.width = sar_ncols_integer;

extracted_sar_image = cvCreateImageHeader(size, IPL_DEPTH_8U, 1);

for (int row = 0 ; row < size.height ;row++)
{
    memcpy(&extracted_sar_image->imageData[row*extracted_sar_image->widthStep],&myArray.data()[row*size.width],size.width);
}
于 2013-02-19T09:57:46.210 回答