Путаница между фактическим разрешением / форматом битовой карты интерполяции - PullRequest
0 голосов
/ 20 января 2012

Я использую веб-камеру Logitech pro9000 HD. Которые имеют 2 мегапикселя Zeiss Lence и могут захватывать HD видео и т. Д. 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 х 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

1 Ответ

0 голосов
/ 04 ноября 2012

Во-первых, очень жаль, что я полностью забыл об этом вопросе

Ответ таков: эти структуры предназначены для нативных API.

У моей камеры был объектив с разрешением 2 мегапикселя, и я получал правильное изображение приразрешение 1600 x 1200 Математика проста

1600 x 1200 = 1920000 Всего пикселей

Формат пикселя 24 бит на пиксель, означает 3 байта на каждый пиксель, общий размер изображения 5760000

Этот объектив больше не может выдавать данные размером более 2 МБ, поэтому 1600x1200 является пределом аппаратного разрешения для этой камеры, а аппаратное обеспечение не отвечает за интерполяцию для изображения с более высоким разрешением, поэтому я должен сделать это вручную после получения исходного изображения с камеры.

Именно это я и сделал;Я снимаю изображение 1600x1200 и пишу алгоритмы обработки изображений, чтобы создать интерполяцию и улучшить качество этого изображения.Проект создавал дешевое устройство для сканирования книг для сканирования документов.Была успешно выполнена и используется нашими клиентами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...