cv::Mat image = cv::Mat::ones(pixelHeight, pixelWidth, CV_8UC3) * 255;为什么生成蓝色的,不是白底的怎么改为白色的
时间: 2024-02-28 17:54:59 浏览: 21
`cv::Mat::ones(pixelHeight, pixelWidth, CV_8UC3) * 255` 的作用是生成一个每个像素值都为 255 的 `CV_8UC3` 格式的图像,也就是一个全白图像。但是在 `putText` 函数中,`cv::Scalar(0, 0, 0)` 表示字体颜色为黑色。因此,在生成图像时会将黑色字体放在全白图像上,生成的图像会是黑底白字的。
要生成白底黑字的图像,只需将 `cv::Scalar(0, 0, 0)` 更改为 `cv::Scalar(255, 255, 255)`,表示字体颜色为白色即可。最终的代码如下:
```
cv::Mat image = cv::Mat::ones(pixelHeight, pixelWidth, CV_8UC3) * 255;
int tmp = 57;
for(int i = 0; i < 4; i++) {
cv::putText(image, nativeText, cv::Point((int)x, (int)y + i * 57), cv::FONT_HERSHEY_SIMPLEX, size,
cv::Scalar(255, 255, 255), 3, cv::LINE_AA,false);
}
```
相关问题
cv::Mat image = cv::Mat::ones(pixelHeight, pixelWidth, CV_8UC3) * 255; int tmp = 57; for(int i = 0; i < 4;i++) { cv::putText(image, nativeText, cv::Point((int)x, (int)y + i*57), cv::FONT_HERSHEY_SIMPLEX, size, cv::Scalar(0, 0, 0), 3, cv::LINE_AA,false); }改为生成白底黑字的图片
您可以通过将 `putText` 函数中的 `cv::Scalar(0, 0, 0)` 更改为 `cv::Scalar(255, 255, 255)`,即可生成白底黑字的图片。最终代码如下所示:
```
cv::Mat image = cv::Mat::ones(pixelHeight, pixelWidth, CV_8UC3) * 255;
int tmp = 57;
for(int i = 0; i < 4; i++) {
cv::putText(image, nativeText, cv::Point((int)x, (int)y + i * 57), cv::FONT_HERSHEY_SIMPLEX, size,
cv::Scalar(255, 255, 255), 3, cv::LINE_AA,false);
}
```
根据输入的平面图片映射每个像素点到一张新的VR全景图中,类似世界地图的全景图方式,保证映射后的内容在360VR全景中显示正常,参数1: 图像元素文件路径 参数2: 图像元素内容在VR全景图的起始坐标 参数2: 输出VR全景图大小 参数3: 输出VR全景文件路径 ;使用C++实现,使用gdi+;
实现这个功能涉及到以下几个步骤:
1. 加载原始图片
使用 GDI+ 库的 `Bitmap` 类可以很方便地加载图片。代码如下:
```c++
#include <gdiplus.h>
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;
Image* image = Image::FromFile(L"path\\to\\image.jpg");
```
2. 创建 VR 全景图
创建 VR 全景图需要使用 GDI+ 库的 `Bitmap` 类,需要指定宽度和高度。代码如下:
```c++
int width = 4096; // 输出 VR 全景图宽度
int height = 2048; // 输出 VR 全景图高度
Bitmap* vrImage = new Bitmap(width, height, PixelFormat32bppARGB);
```
3. 将原始图片映射到 VR 全景图中
根据参数2中给出的起始坐标,将原始图片的每个像素点映射到 VR 全景图中对应的位置。具体实现方式可以使用双线性插值法,保证映射后的内容在 360VR 全景中显示正常。
4. 输出 VR 全景图
使用 GDI+ 库的 `Bitmap` 类的 `Save` 方法可以将 VR 全景图保存到本地文件。代码如下:
```c++
wstring outputPath(L"path\\to\\output.jpg"); // 输出 VR 全景图路径
CLSID jpegClsid;
GetEncoderClsid(L"image/jpeg", &jpegClsid); // 获取 JPEG 编码器的 CLSID
EncoderParameters encoderParams;
encoderParams.Count = 1;
encoderParams.Parameter[0].Guid = EncoderQuality;
encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParams.Parameter[0].NumberOfValues = 1;
encoderParams.Parameter[0].Value = &quality; // 输出 JPEG 图片的质量
vrImage->Save(outputPath.c_str(), &jpegClsid, &encoderParams);
```
完整代码如下:
```c++
#include <gdiplus.h>
#include <cmath>
#pragma comment (lib,"Gdiplus.lib")
using namespace Gdiplus;
void GetEncoderClsid(const WCHAR* format, CLSID* pClsid)
{
UINT num = 0; // number of image encoders
UINT size = 0; // size of the image encoder array in bytes
ImageCodecInfo* pImageCodecInfo = NULL;
GetImageEncodersSize(&num, &size);
if (size == 0)
{
return;
}
pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
if (pImageCodecInfo == NULL)
{
return;
}
GetImageEncoders(num, size, pImageCodecInfo);
for (UINT i = 0; i < num; ++i)
{
if (wcscmp(pImageCodecInfo[i].MimeType, format) == 0)
{
*pClsid = pImageCodecInfo[i].Clsid;
break;
}
}
free(pImageCodecInfo);
}
void MapPixelToVRImage(Bitmap* vrImage, Bitmap* pixelImage, int startX, int startY)
{
int vrWidth = vrImage->GetWidth();
int vrHeight = vrImage->GetHeight();
int pixelWidth = pixelImage->GetWidth();
int pixelHeight = pixelImage->GetHeight();
for (int y = 0; y < pixelHeight; ++y)
{
for (int x = 0; x < pixelWidth; ++x)
{
Color pixelColor;
pixelImage->GetPixel(x, y, &pixelColor);
int vrX = startX + (x * vrWidth) / pixelWidth;
int vrY = startY + (y * vrHeight) / pixelHeight;
Color vrColor;
vrImage->GetPixel(vrX, vrY, &vrColor);
int r = (pixelColor.GetR() + vrColor.GetR()) / 2;
int g = (pixelColor.GetG() + vrColor.GetG()) / 2;
int b = (pixelColor.GetB() + vrColor.GetB()) / 2;
Color newColor(r, g, b);
vrImage->SetPixel(vrX, vrY, newColor);
}
}
}
void CreateVRImageFromPixelImages(const WCHAR* pixelImagePath, int startX, int startY, int vrWidth, int vrHeight, const WCHAR* outputImagePath)
{
Bitmap* pixelImage = Image::FromFile(pixelImagePath);
Bitmap* vrImage = new Bitmap(vrWidth, vrHeight, PixelFormat32bppARGB);
MapPixelToVRImage(vrImage, pixelImage, startX, startY);
CLSID jpegClsid;
GetEncoderClsid(L"image/jpeg", &jpegClsid);
EncoderParameters encoderParams;
encoderParams.Count = 1;
encoderParams.Parameter[0].Guid = EncoderQuality;
encoderParams.Parameter[0].Type = EncoderParameterValueTypeLong;
encoderParams.Parameter[0].NumberOfValues = 1;
int quality = 80; // JPEG 图片的质量
encoderParams.Parameter[0].Value = &quality;
vrImage->Save(outputImagePath, &jpegClsid, &encoderParams);
delete pixelImage;
delete vrImage;
}
int main()
{
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
CreateVRImageFromPixelImages(L"path\\to\\pixelImage.jpg", 0, 0, 4096, 2048, L"path\\to\\vrImage.jpg");
GdiplusShutdown(gdiplusToken);
return 0;
}
```