2017-05-03 48 views
0

對於我的實習,我必須用prosillica相機創建照片,我一直在尋找不同的api,以便能夠使用相機。現在我發現了一個可行的,我寫了一個以前的實習生寫的代碼(「猜測」他說)。我得到的圖像,但他們都放大。在官方Firegrab程序中,圖片看起來很好,並沒有放大。你可以看看圖像here。我寫信給連接到攝像機的代碼是如下:AVT Firewrap.net即使它沒有編碼,相機也會放大

Ctrl = FireWrap_CtrlCenter.GetInstance(); 
      Ctrl.OnFrameReady += OnFrameReady; 
      Result = Ctrl.FGInitModule(); 
      if (Result == enFireWrapResult.E_NOERROR) 
      { 
       Result = InfoContainer.FGGetNodeList(); 
       var NodeCnt = InfoContainer.Size(); 

       InfoContainer.GetAt(NodeInfo, 0); 
       Result = Cam.Connect(NodeInfo.Guid); 

       cCamera.Items.Add(Cam.DeviceAll); 

       if (Result == enFireWrapResult.E_NOERROR) 
       { 
        Cam.m_Guid = NodeInfo.Guid; 
       } 

       if (Result == enFireWrapResult.E_NOERROR) 
       { 
        Result = Cam.SetParameter(enFGParameter.E_IMAGEFORMAT, 
         (((uint)enFGResolution.E_RES_SCALABLE << 16) | 
         ((uint)enColorMode.E_CCOLORMODE_Y8 << 8) | 
         0)); 
       } 

       if (Result == enFireWrapResult.E_NOERROR) 
        Result = Cam.OpenCapture(); 

       // Print device settings 
       Result = Cam.GetParameter(enFGParameter.E_XSIZE, ref XSize); 
       Result = Cam.GetParameter(enFGParameter.E_YSIZE, ref YSize); 
       width = XSize; 
       height = YSize; 
       // Start camera 
       if (Result == enFireWrapResult.E_NOERROR) 
       { 
        Result = Cam.StartDevice(); 
       } 
      } 

當我連接到相機,我也告訴它立即開始錄製。幀我得到時照相機將會在OnFrameReady被處理,這是我用於以下的代碼:

Debug.WriteLine("OnFrameReady is called"); 
      FGEventArgs args = (FGEventArgs)__p2; 
      FGFrame Frame; 
      Guid.High = args.High; 
      Guid.Low = args.Low; 

      if (Guid.Low == Cam.m_Guid.Low) 
      { 
       Result = Cam.GetFrame(Frame, 0); 
       // Process frame, skip FrameStart notification 
       if (Result == enFireWrapResult.E_NOERROR & Frame.Length > 0) 
       { 
        byte[] data = new byte[Frame.Length]; 

        // Access to frame data 
        if (Frame.CloneData(data)) 
        { 
         //DisplayImage(data.Clone()); 
         SaveImageFromByteArray(data); 
         // Here you can start your image processsing logic on data 
         string debug = String.Format("[{6}] Frame #{0} length:{1}byte [ {2} {3} {4} {5} ... ]", 
          Frame.Id, Frame.Length, data[0], data[1], data[2], data[3], Cam.m_Guid.Low); 
         Debug.WriteLine(debug); 
        } 
        // Return frame to module as fast as posible after this the Frame is not valid 
        Result = Cam.PutFrame(Frame); 
       } 
      } 

因此,在這種功能我得到的幀,並把它在一個byte [],然後我所說的函數SaveImageFromByteArray();在那裏我把字節[]在列表中。所以我可以稍後訪問我的所有照片以保存它們。作爲遵循了SaveImageFromByteArray代碼:

public void SaveImageFromByteArray(byte[] byteArray) 
     { 
      try 
      { 
       //bytearray size determined 
       byte[] data = new byte[width * height * 4]; 
       int o = 0; 
       //bytearray size filled 
       for (int io = 0; io < width * height; io++) 
       { 
        byte value = byteArray[io]; 
        data[o++] = value; 
        data[o++] = value; 
        data[o++] = value; 
        data[o++] = 0; 
       } 
       bytearrayList.Add(data); 


      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.ToString()); 
      } 
     } 

IM後進行重新編寫所有的幀,我點擊保存,停止攝像機,然後我調用以下函數將其保存到一個位圖文件:

public void SaveData() 
     { 
      try 
      { 
       foreach (byte[] data1 in bytearrayList) 
       { 
        byte[] data = Save(data1); 
        lock (this) 
        { 
         unsafe 
         { 
          fixed (byte* ptr = data) 
          { 
           try 
           { 
            using (image = new Bitmap((int) width, (int) height, (int) width * 4, 
             System.Drawing.Imaging.PixelFormat.Format32bppPArgb, new IntPtr(ptr))) 
            { 
             image.Save(path + nextpicture + ".bmp", ImageFormat.Bmp); 
             Debug.WriteLine("Image saved at " + path + nextpicture + ".bmp"); 
             nextpicture++; 
            } 
           } 
           catch (Exception ex) 
           { 
            Debug.Write(ex.ToString()); 
           } 
          } 
         } 
        } 
       } 
      } 

      catch (Exception ex) 
      { 

       Debug.Write(ex.ToString()); 
      } 
     } 

保存功能調用該函數上面寫如下:

private byte[] Save(byte[] data1) 
     { 
      //bytearray size determined 
      byte[] data = new byte[width * height * 4]; 
      int o = 0; 
      //bytearray size filled 
      for (int io = 0; io < width * height; io++) 
      { 
       byte value = data1[io]; 
       data[o++] = value; 
       data[o++] = value; 
       data[o++] = value; 
       data[o++] = 0; 
      } 
      return data; 
     } 

我認爲,當我們連接到相機和我們執行該L變焦的問題發生代碼INE:

if (Result == enFireWrapResult.E_NOERROR) 
      { 
       Result = Cam.SetParameter(enFGParameter.E_IMAGEFORMAT, 
        (((uint)enFGResolution.E_RES_SCALABLE << 16) | 
        ((uint)enColorMode.E_CCOLORMODE_Y8 << 8)| 
        0)); 
      } 

但問題是,有沒有被發現約Firewrap.net或他們的API文檔。即使我們試圖編輯16到15,相機也不會啓動

回答

0

發現問題!像素被水平伸展到4個像素,這是因爲我們做了兩次:

byte[] data = new byte[width * height * 4]; 
      int o = 0; 
      //bytearray size filled 
      for (int io = 0; io < width * height; io++) 
      { 
       byte value = byteArray[io]; 
       data[o++] = value; 
       data[o++] = value; 
       data[o++] = value; 
       data[o++] = 0; 
      } 
相關問題