使用OpenCV 读取图片 ,再用OpenGL显示,图像有错位

最近在做Kinect跟踪的时候需要做视差图与蒙版的运算。因为图片很多,所以想利用OpenGL的GLSL来加速。做到最后发现生成的图像不对!自习检查了代码流程,没发现问题。

单步调试的时候看到图像变量有数据也没有追究,浪费N个小时之后,决定去掉各种复杂功能,单独用GLSL显示一张图片看看效果。

于是发现了问题所在:

就是用OpenCV读取图片的问题。最简单的就是用OpenCV自带的函数,一句代码即可读取一张图片到内存。


几点说明:

  1. 用 imread() 函数读取图片,保存在Mat类型变量里面;
  2. 用imshow() 函数显示该图片的时候显示正常!!(这里极具迷惑性!!)
  3. 但是!用OpenGL的glDrawPixels()函数显示不正常;用GLSL显示(纹理)不正常。但是不正常的这两个是一样的,具体可见下面的对比。
  4. 试过3通道,4通道的图像,结果一样
  5. 有的jpg图像能正常显示,有的不能(求大神解释==)

使用OpenCV 读取图片 ,再用OpenGL显示,图像有错位_第1张图片

使用OpenCV 读取图片 ,再用OpenGL显示,图像有错位_第2张图片


可以看到:

  1. 结果图是上下颠倒的(看”1“的尖端)
  2. 结果图的红线拼凑到一起就是原图的”1“,并且结果图上的几个”1“并不是重合的,估计正好可以拼成原图的”1"

==========================================此为分割线===============================================================


于是我换了一种思路,不用OpenCV读取图像,而是用C语言自带的文件读取,遵循BMP文件格式,自己读取BMP图像,代码参考如下:

// LoadBitmapFile
// desc: Returns a pointer to the bitmap image of the bitmap specified
//       by filename. Also returns the bitmap header information.
//		 No support for 8-bit bitmaps.
unsigned char *LoadBitmapFile(char *filename, BITMAPINFOHEADER *bitmapInfoHeader)
{
	FILE *filePtr;								// the file pointer
	BITMAPFILEHEADER	bitmapFileHeader;		// bitmap file header
	unsigned char		*bitmapImage;			// bitmap image data
	int					imageIdx = 0;			// image index counter
	unsigned char		tempRGB;				// swap variable

	// open filename in "read binary" mode
	filePtr = fopen(filename, "rb");
	if (filePtr == NULL)
		return NULL;

	// read the bitmap file header
	fread(&bitmapFileHeader, sizeof(BITMAPFILEHEADER), 1, filePtr);

	// verify that this is a bitmap by checking for the universal bitmap id
	if (bitmapFileHeader.bfType != BITMAP_ID)
	{
		fclose(filePtr);
		return NULL;
	}

	// read the bitmap information header
	fread(bitmapInfoHeader, sizeof(BITMAPINFOHEADER), 1, filePtr);

	// move file pointer to beginning of bitmap data
	fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);

	// allocate enough memory for the bitmap image data
	bitmapImage = (unsigned char*)malloc(bitmapInfoHeader->biSizeImage);

	// verify memory allocation
	if (!bitmapImage)
	{
		free(bitmapImage);
		fclose(filePtr);
		return NULL;
	}

	// read in the bitmap image data
	fread(bitmapImage, 1, bitmapInfoHeader->biSizeImage, filePtr);

	// make sure bitmap image data was read
	if (bitmapImage == NULL)
	{
		fclose(filePtr);
		return NULL;
	}

	// swap the R and B values to get RGB since the bitmap color format is in BGR
	//for (imageIdx = 0; imageIdx < bitmapInfoHeader->biSizeImage; imageIdx+=3)  // 不需要!OpenGL 纹理参数 GL_BGR_EXT就可以简单实现
	//{
	//	tempRGB = bitmapImage[imageIdx];
	//	bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
	//	bitmapImage[imageIdx + 2] = tempRGB;
	//}

	// close the file and return the bitmap image data
	fclose(filePtr);
	return bitmapImage;
}

结果真的正确了!!!真是要感动哭了!!!!虽然我也不知道为啥==

不知道有没有大神知道:为啥OpenCV读取的图片OpenGL来使用会出错呢?



你可能感兴趣的:(Bug集锦)