Câu trả lời trước của tôi đã bị xóa do định dạng của nó, tôi sẽ viết lại, theo cách tốt hơn.
Tôi đã hỏi bạn xem bạn có cân nhắc sử dụng GPU để tính toán sự khác biệt hình ảnh giữa hai hình ảnh của bạn hay không. Giải pháp này có thể nâng cao đáng kể thời gian tính toán của bạn vì GPU là rất song song so với tính toán CPU.
Sử dụng C#, bạn có thể thử sử dụng XNA cho mục đích này. Trên thực tế tôi đã làm một thử nghiệm nhỏ sử dụng một đường chuyền HLSL duy nhất (đó là những gì được sử dụng để chương trình GPU với Direct3D) pixel shader:
texture texture1;
texture texture2;
sampler textureSampler1 = sampler_state{
Texture = <texture1>;
};
sampler textureSampler2 = sampler_state{
Texture = <texture2>;
};
float4 pixelShaderFunction(float2 TextureCoordinate : TEXCOORD0) : COLOR0{
float4 color1 = tex2D(textureSampler1,TextureCoordinate);
float4 color2 = tex2D(textureSampler2,TextureCoordinate);
if((color1.r == color2.r) && (color1.g == color2.g) && (color1.b == color2.b)){
color1.r = 0;
color1.g = 0;
color1.b = 0;
}
else{
color1.r = 255;
color1.g = 255;
color1.b = 255;
}
return color1;
}
technique Compare
{
pass Pass1
{
PixelShader = compile ps_2_0 pixelShaderFunction();
}
}
Các tính toán trên một phần XNA là thực sự đơn giản. Sử dụng đoạn mã cơ sở của XNA với visual studio, tôi chỉ viết những chức năng vẽ như:
protected override void Draw(GameTime gameTime) {
Stopwatch sw = new Stopwatch();
sw.Start();
GraphicsDevice.Clear(Color.CornflowerBlue);
e.Parameters["texture1"].SetValue(im1);
e.Parameters["texture2"].SetValue(im2);
spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.AlphaBlend, SamplerState.LinearClamp, DepthStencilState.Default, RasterizerState.CullNone, e);
spriteBatch.Draw(im1,new Vector2(0,0),Color.White);
spriteBatch.End();
base.Draw(gameTime);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
IM1 và im2 là những hình ảnh bmp màu hai 1920 * 1080 nạp như Texture2D, và e là file.fx nạp như một hiệu ứng.
Sử dụng kỹ thuật này, tôi nhận được một thời gian tính toán 17/18ms trên máy tính khá thường xuyên (máy tính xách tay với i5-2410M tốc độ 2,3 GHz, RAM 4GB, Nvidia Geforce GT525m.
Đây là kết quả của chương trình, với hình ảnh khác biệt được hiển thị (xin lỗi điều này được thu phóng cao vì tôi KHÔNG có màn hình 1920 * 1080:>) và bên cạnh đó là hai hình ảnh im1 và im2 với một số khác biệt nhỏ giữa chúng: http://img526.imageshack.us/img526/2345/computationtime.jpg
Tôi khá mới để lập trình GPU, vì vậy nếu tôi thực hiện một sai lầm lớn liên quan đến cách tính thời gian hoặc bất kỳ điều gì khác, vui lòng cho biết!
Chỉnh sửa: Điều đầu tiên cần lưu ý, tôi chỉ đọc rằng "nó sẽ là một hoạt động không thuận lợi vì GPU không xử lý phân nhánh rất tốt".
Trân trọng
OpenCV là thư viện tốt để xử lý hình ảnh. Điều đó nói rằng, nếu bạn không nhấn mạnh vào việc tự mình lập trình, tôi đã tìm thấy http://www.addictivetips.com/windows-tips/thinvnc-windows-remote-desktop-via-html5-web-browser/ dường như s.th tương tự. – Nodebody
Tôi rất vui khi sử dụng thư viện bên ngoài, nhưng nó cần các ràng buộc C# tốt không phải GPL (LGPL, BSD, giấy phép Apache là tốt - không phải là giấy phép 'lan truyền') và một số tài liệu về các tính năng hữu ích để giúp tôi thực hiện điều này. – PhonicUK
Bạn phải so sánh mọi điểm ảnh giữa các hình ảnh - không có cách nào để làm tròn nó. Bạn hiện đang so sánh như thế nào? Bạn đã sử dụng mã không được quản lý? –