【发布时间】:2014-02-08 17:13:31
【问题描述】:
我正在从 Azure Blob 存储读取一些图像。这是 c# 中的流。
在 c++/cli 中我需要这样做:
cv::Mat img_object = imdecode(data, IMREAD_UNCHANGED);
其中数据的类型为 cv::InputArray
所以问题是我如何最好地从 c# 到 cv::mat?
public ref class Client
{
public:
// TODO: Add your methods for this class here.
void Method(Stream ^ img1, Stream ^ img2);
};
void Client::Method(...){
}
我只是输入了 Stream ^ img1,Stream ^img2,这不是必需的,只是不确定从 c# 流到 cv::Mat 类的最佳方法是什么。
我知道我可以将流保存在临时文件位置并使用 imread 代替,但最好在内存中执行。
在 csharp 中我只是有这样的东西:(我知道它不是正确的方法,但为了这个例子的目的,它说明了这一点)。
Client client = new Client();
client.Method(blob.GetStream(), blob.GetStream())
更新:先试试
void CVService::Stiching::StichingClient::FindHomography(cli::array<unsigned char>^ pCBuf1, cli::array<unsigned char> ^ pCBuf2)
{
pin_ptr<unsigned char> data1 = &pCBuf1[0];
pin_ptr<unsigned char> data2 = &pCBuf2[0];
Mat img_object = imdecode(*data1,IMREAD_COLOR);
Mat img_scene = imdecode(*data2, IMREAD_COLOR);
if (!img_object.data || !img_scene.data)
{
return;
}
imwrite("c:\\test.jpg", img_object);
}
和
public class WebRole : RoleEntryPoint
{
public override bool OnStart()
{
// For information on handling configuration changes
// see the MSDN topic at http://go.microsoft.com/fwlink/?LinkId=166357.
StichingClient client = new StichingClient();
client.FindHomography(ReadByteArray(path1).Result
, ReadByteArray(path2).Result);
return base.OnStart();
}
private async Task<byte[]> ReadByteArray(string p)
{
using (var fs = File.OpenRead(p))
{
using (var ms = new MemoryStream())
{
await fs.CopyToAsync(ms);
return ms.ToArray();
}
}
}
}
问题是加载的 cv::mat 的 data== 0 并且没有将图像写入磁盘。我已经验证传递的 char 数组包含数据。有什么方法可以找出为什么 imdecode 不解码图像?
更新 2
c++/cli 代码部分的以下测试有效:
Mat test1 = imread("DSC_023.tif");
std::vector<unsigned char> buf;
imencode(".jpg", test1, buf);
Mat test2 = imdecode(buf, IMREAD_COLOR);
上面 4 行 test2 是加载的图像和 imdecode 作品。所以想知道为什么当数据以字节数组形式出现时它不起作用
【问题讨论】:
-
让我回顾一下:imdecode 问题归结为:如何从 Task
获取向量 ? (不知道,只是想跟随你的思路..) -
没有。不是任务。那是异步等待。 client.FindHomography(byte[] , byte[]) 是 c++/cli 部分的内容。
-
哦,抱歉误读了。
-
我猜我没有将正确的数据传递给 imdecode,因为我已经证明,如果我只是用 c++ 中的 imread 读取数据,它就可以工作。
-
hmm,将不得不深入研究您的代码,但FindHomography 既不是返回像素,也不是图像的“磁盘上图像”版本,而是“转换”x,y 的向量点(仅位置,而不是'强度甚至'颜色'值)