[英]Convert Texture2D to OpenCV Mat?
有一個帖子關於如何將OpenCV的cv::Mat
到Texture2D
團結我提供了行之有效的答案。 現在,我正試圖做相反的事情,但是已經堅持了幾個小時。
我想將Unity的Texture2D
轉換為OpenCV cv::Mat
以便可以在C ++端處理Texture。
這是我要轉換為cv:Mat
Unity項目中的原始Texture2D
:
將其轉換為cv:Mat
之后的樣子如下:
它看起來很褪色。 我不擔心圖像的旋轉 。 我可以解決。 只是想知道為什么它看起來這么洗掉了。 還使用cv::imwrite
來保存圖像以進行測試,但是問題也存在於已保存的圖像中。
C#代碼 :
[DllImport("TextureConverter")]
private static extern float TextureToCVMat(IntPtr texData, int width, int height);
unsafe void TextureToCVMat(Texture2D texData)
{
Color32[] texDataColor = texData.GetPixels32();
//Pin Memory
fixed (Color32* p = texDataColor)
{
TextureToCVMat((IntPtr)p, texData.width, texData.height);
}
}
public Texture2D tex;
void Start()
{
TextureToCVMat(tex);
}
C ++代碼 :
DLLExport void TextureToCVMat(unsigned char* texData, int width, int height)
{
Mat texture(height, width, CV_8UC4, texData);
cvNamedWindow("Unity Texture", CV_WINDOW_NORMAL);
//cvResizeWindow("Unity Texture", 200, 200);
cv::imshow("Unity Texture", texture);
cv::imwrite("Inno Image.jpg", texture);
}
我還嘗試在C ++端創建一個struct
來保存像素信息,而不是使用unsigned char*
但結果仍然相同:
struct Color32
{
uchar r;
uchar g;
uchar b;
uchar a;
};
DLLExport void TextureToCVMat(Color32* texData, int width, int height)
{
Mat texture(height, width, CV_8UC4, texData);
cvNamedWindow("Unity Texture", CV_WINDOW_NORMAL);
cvResizeWindow("Unity Texture", 200, 200);
cv::imshow("Unity Texture", texture);
}
為什么圖像看起來如此褪色,您如何解決呢?
默認情況下, OpenCV將圖像創建為BGR
,而Color32
將像素存儲為RGBA
。 但是,由於OP在注釋中提到Texture2D.format
提供的紋理格式為RGB24
,因此我們可以完全忽略alpha通道。
DLLExport void TextureToCVMat(unsigned char* texData, int width, int height)
{
Mat texture(height, width, CV_8UC4, texData);
cv::cvtColor(texture,texture,cv::COLOR_BGRA2RGB);
cv::imshow("Unity Texture", texture);
cv::waitKey(0);
cv::destroyAllWindows();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.