ComUInt32
LmParameter::actualInDataSize(void *data) const
{
  if (inVCLenIndSize_ == 0)
    return inSize();
  else
    return vcDataSize((char*)data, inVCLenIndOffset_, inVCLenIndSize_);
}
示例#2
0
bool TransportSimple::retargetImage(cv::Mat const &input,
                                    int     const &colReduc, 
                                    int     const &rowReduc,
                                    cv::Mat       &output)
{
   // Create the grayscale
   cv::cvtColor(input, m_gray, CV_RGB2GRAY);
   cv::Mat workImg;
   cv::Mat workRGB;
   input.copyTo(workRGB);
   m_gray.copyTo(workImg);

   // Start at zero and evaluate every option
   // until we get to the required number of cuts
   int colCount = 0;
   int rowCount = 0;

   // Keep track of the size
   cv::Size size(input.cols,input.rows);
   cv::Size inSize(0,0);
   cv::Size hSize(0,0);

   // Create some extra helpers
   cv::Mat hCutImg, vCutImg;
   cv::Mat hPath,   vPath;
   float   hCost = 0;
   float   vCost = 0;
   
   // Create a window
   cv::namedWindow("Carved",1);
   cv::Mat tmpRGB, hTmp;
   // Iterate until one of the counters is zero
   while( colCount < colReduc && rowCount < rowReduc )
   {
      // Calculate a vertical cut
      inSize.width  = input.cols-colCount;
      inSize.height = input.rows-rowCount;
      calculateSeamCost( workImg, vCutImg, vPath, vCost ,true,inSize);

      // Calculate a horizontal cut
      inSize.width  = input.rows-rowCount;
      inSize.height = input.cols-colCount;
      calculateSeamCost( workImg, hCutImg, hPath, hCost ,false,inSize);

      if( hCost < vCost ) // take the horizontal cut
      {
         hCutImg.copyTo(workImg);
         --size.height;

         // Transpose
         cv::transpose(workRGB,tmpRGB);
         hSize.width  = size.height;
         hSize.height = size.width;
         Filters::removeSeamRGB(tmpRGB,hPath,workRGB,hSize); 
         cv::transpose(workRGB,tmpRGB);
         ++rowCount;
      }
      else
      {
         vCutImg.copyTo(workImg);
         --size.width;
         Filters::removeSeamRGB(workRGB,vPath,tmpRGB,size); 
         ++colCount;
      }
      tmpRGB.copyTo(workRGB);
      cv::imshow("Carved",workRGB);
      cv::waitKey(5);
   }

   // One of them hit zero, which was it?
   while( colCount < colReduc )
   {
      // Calculate a vertical cut
      inSize.width  = input.cols-colCount;
      inSize.height = input.rows-rowCount;
      calculateSeamCost( workImg, vCutImg, vPath, vCost ,true,inSize);
      vCutImg.copyTo(workImg);
  
      // Update the size
      ++colCount;
      --size.width;
  
      Filters::removeSeamRGB(workRGB,vPath,tmpRGB,size);
      tmpRGB.copyTo(workRGB);
 
      // Display the result
      cv::imshow("Carved",workRGB);
      cv::waitKey(5);
   }
   while( rowCount < rowReduc )
   {
      // Calculate a vertical cut
      inSize.height = input.cols-colCount;
      inSize.width = input.rows-rowCount;
      calculateSeamCost( workImg, hCutImg, hPath, hCost ,false,inSize);
      hCutImg.copyTo(workImg);

      // Update the size
      ++rowCount;
      --size.height;

      // Transpose
      cv::transpose(workRGB,tmpRGB);
      hSize.width  = size.height;
      hSize.height = size.width;
      Filters::removeSeamRGB(tmpRGB,hPath,workRGB,hSize); 
      cv::transpose(workRGB,tmpRGB);
      tmpRGB.copyTo(workRGB);

      // Display
      cv::imshow("Carved",workRGB);
      cv::waitKey(5);

   }

   cv::Rect roi(0,0,size.width,size.height);
   cv::Mat  tmpOut = workRGB(roi);
   tmpOut.copyTo(output);
   return true;
}