实际分辨率/插值位图格式之间的混淆

发布于 2024-12-28 02:32:34 字数 1756 浏览 4 评论 0原文

我使用的是 Logitech pro9000 高清网络摄像头。有 2 mp zeiss lence,可以捕捉高清视频等。 blaa blaa 我的代码[不完全相同,但集成在单个函数中。

现在的问题是,如果我使用高达 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 图像,并且 Logitech 的软件将图像插值到 3264 x 2448 大小(如果是这种情况)那么为什么我没有从设备事件中获取 1600 x 1200 图像我在 init 设置视频格式编码为 3264 x 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

I am using Logitech pro9000 HD webcam. Which have 2 mp zeiss lence and can capture HD video etc. blaa blaa
My code [not exactly the same but integrated in single function.

Now the problem if I use resolution up to 1600 x 1200 everything works fine. And received byte size as follows

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

But for higher resolution from 1600 x 1200 the byte size is same as 1600 x 1200 but my program can’t covert that data to bitmap I event try to set size of bitmap to 1600 x 1200 but nothing works I get only fuzzy at bottom or stretched multiple images at bottom of preview bitmap.
I know this is called interpolation
My question is where the interpolations is implemented actually in driver which I am accessing or the camera application given by company
Means do I am getting the interpolated data or I have to implement the algorithm in my program.
What confused me is if driver is still returning 1600 x 1200 images and software from Logitech is interpolating image to 3264 x 2448 size if this is a case then why I am not getting the 1600 x 1200 image from device event I set video format at init code to 3264 x 2448
[I have set bit to 24 and camera is using Format24bppRgb Pixel Format]
can anyone help me !....

my code is

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情归归情 2025-01-04 02:32:34

首先真的很抱歉,我完全忘记了这个问题

答案是 - 这些结构用于本机 API。

我的相机是 2 兆像素镜头,我以 1600 x 1200 的分辨率获得了正确的图像
数学很简单

1600 x 1200 = 1920000 总像素

像素格式为 24 bpp 意味着每个像素 3 个字节 图像总大小为 5760000

该镜头无法再产生超过 2 mb 的数据,这就是为什么 1600x1200 是该相机的硬件分辨率限制并且硬件不负责对更高分辨率图像进行插值,这就是为什么我必须在获取原始图像后手动进行插值从相机。

这正是我所做的;我捕获 1600x1200 的图像并编写图像处理算法来创建插值并提高该图像的质量。
项目正在创建一种用于文档扫描的廉价书籍扫描设备。已成功完成并已被我们的客户使用。

First really sorry that I completely forgot about this question

The answer is - these structures are for native APIs.

My camera was 2 mega pixel lens and I was getting proper image at resolution of 1600 x 1200
The math is simple

1600 x 1200 = 1920000 Total Pixels

Pixel format is 24 bpp means 3 bytes for each pixel total size of image is 5760000

This lens can no longer produce data more than 2 mb that’s why 1600x1200 is the hardware resolution limit for this camera and hardware is not responsible for interpolation for higher resolution image that’s why I have to do it manually after getting original image from camera.

This is what exactly I did; I capture image of 1600x1200 and write image processing algos to create interpolation and improving quality of that image.
Project was creating a cheap book scanning device for document scanning. Was done successfully and in use by our clients.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文