我使用的是罗技pro9000高清网络摄像头。具有2 mp zeiss能力,可以拍摄高清视频等我的代码[不完全相同,但集成在单个功能中。
现在的问题是,如果我使用高达1600 x 1200的分辨率,一切都很好。接收的字节大小如下
for 640 x 480 VideoHeader.dwBytesUsed are 921600
for 1600 x 1200 VideoHeader.dwBytesUsed are 5760000
from 1600 x 1200 to 3264 x 2448 VideoHeader.dwBytesUsed are 5760000
但对于1600 x 1200的更高分辨率,字节大小与1600 x 1200相同,但我的程序无法将数据转换为位图。我尝试将位图的大小设置为1600 x 1200,但什么都不起作用。我只在预览位图的底部模糊或拉伸了多个图像。我知道这叫做插值我的问题是,在我访问的驱动程序或公司提供的相机应用程序中,插值实际上是在哪里实现的这意味着我要得到插值数据,或者我必须在程序中实现算法。让我困惑的是,如果驱动程序仍在返回1600 x 1200的图像,而罗技的软件正在将图像插值为3264 x 2448大小。如果是这种情况,那么为什么我没有从设备事件中获得1600 x 1200图像?我在初始化代码中将视频格式设置为3264×2448[我已将位设置为24,相机正在使用Format24bppRgb像素格式]有人能帮我吗!。。。。
我的代码是
Private Sub FrameCallBack(ByVal lwnd As IntPtr, ByVal lpVHdr As IntPtr)
Dim _SnapSize As Size = New Size(640, 480)
'Dim _SnapSize As Size = New Size(1600, 1200)
Dim _SnapSize As Size = New Size(3264, 2448)
Dim VideoHeader As New Avicap.VIDEOHDR
Dim VideoData(-1) As Byte
VideoHeader = CType(Avicap.GetStructure(lpVHdr, VideoHeader), Avicap.VIDEOHDR)
VideoData = New Byte(VideoHeader.dwBytesUsed - 1) {}
Marshal.Copy(VideoHeader.lpData, VideoData, 0, VideoData.Length)
Dim _SnapFormat As System.Drawing.Imaging.PixelFormat = PixelFormat.Format24bppRgb
Dim outBit As Bitmap
If Me.IsValidData Then
outBit = New Bitmap(_SnapSize.Width, _SnapSize.Height, _SnapFormat)
Dim bitData As BitmapData
bitData = outBit.LockBits(New Rectangle(Point.Empty, _SnapSize), ImageLockMode.WriteOnly, _SnapFormat)
outBit.UnlockBits(bitData)
GC.Collect()
GC.WaitForPendingFinalizers()
End If
End Sub
首先非常抱歉,我完全忘记了这个问题
答案是,这些结构适用于本机API。
我的相机是200万像素的镜头,我得到了1600 x 1200分辨率的正确图像数学很简单
1600 x 1200=1920000总像素
像素格式为24bpp意味着每个像素3个字节图像的总大小为5760000
这个镜头不能再产生超过2 mb的数据,这就是为什么1600x1200是这个相机的硬件分辨率限制,硬件不负责更高分辨率图像的插值,这就是我从相机获得原始图像后必须手动进行插值的原因。
这正是我所做的;我拍摄了1600x1200的图像,并编写了图像处理算法来创建插值并提高图像的质量。Project正在创建一个用于文档扫描的廉价书籍扫描设备。已成功完成并被我们的客户使用。