@@ -1545,7 +1545,7 @@ struct Net::Impl
1545
1545
CV_Error (Error::StsOutOfRange, " Layer \" " + ld.name + " \" produce only " + toString (ld.outputBlobs .size ()) +
1546
1546
" outputs, the #" + toString (pin.oid ) + " was requsted" );
1547
1547
}
1548
- if (preferableBackend != DNN_TARGET_CPU )
1548
+ if (preferableBackend != DNN_BACKEND_DEFAULT )
1549
1549
{
1550
1550
// Transfer data to CPU if it's require.
1551
1551
ld.outputBlobsWrappers [pin.oid ]->copyToHost ();
@@ -1561,10 +1561,35 @@ struct Net::Impl
1561
1561
return ld.outputBlobs [pin.oid ];
1562
1562
}
1563
1563
1564
+ void getBlob (UMat& umat, const LayerPin& pin)
1565
+ {
1566
+ CV_TRACE_FUNCTION ();
1567
+
1568
+ if (!pin.valid ())
1569
+ CV_Error (Error::StsObjectNotFound, " Requested blob not found" );
1570
+
1571
+ LayerData &ld = layers[pin.lid ];
1572
+ if ((size_t )pin.oid >= ld.outputBlobs .size ())
1573
+ {
1574
+ CV_Error (Error::StsOutOfRange, " Layer \" " + ld.name + " \" produce only " + toString (ld.outputBlobs .size ()) +
1575
+ " outputs, the #" + toString (pin.oid ) + " was requsted" );
1576
+ }
1577
+
1578
+ if (ld.umat_outputBlobs .size () > 0 && !ld.umat_outputBlobs [pin.oid ].empty ())
1579
+ umat = ld.umat_outputBlobs [pin.oid ];
1580
+ else
1581
+ umat = UMat ();
1582
+ }
1583
+
1564
1584
Mat getBlob (String outputName)
1565
1585
{
1566
1586
return getBlob (getPinByAlias (outputName));
1567
1587
}
1588
+
1589
+ void getBlob (UMat& umat, String outputName)
1590
+ {
1591
+ getBlob (umat, getPinByAlias (outputName));
1592
+ }
1568
1593
};
1569
1594
1570
1595
Net::Net () : impl(new Net::Impl)
@@ -1642,7 +1667,7 @@ Mat Net::forward(const String& outputName)
1642
1667
return impl->getBlob (layerName);
1643
1668
}
1644
1669
1645
- void Net::forward (std::vector<Mat>& outputBlobs, const String& outputName)
1670
+ void Net::forward (OutputArrayOfArrays outputBlobs, const String& outputName)
1646
1671
{
1647
1672
CV_TRACE_FUNCTION ();
1648
1673
@@ -1658,24 +1683,48 @@ void Net::forward(std::vector<Mat>& outputBlobs, const String& outputName)
1658
1683
LayerPin pin = impl->getPinByAlias (layerName);
1659
1684
LayerData &ld = impl->layers [pin.lid ];
1660
1685
1661
- if (ld. umat_outputBlobs . size () > 0 )
1686
+ if (outputBlobs. isUMat () )
1662
1687
{
1663
- for (int i = 0 ; i < ld.umat_outputBlobs .size (); i++)
1664
- ld.umat_outputBlobs [i].copyTo (ld.outputBlobs [i]);
1688
+ if (ld.umat_outputBlobs .size () > 0 )
1689
+ {
1690
+ UMat umat;
1691
+ impl->getBlob (umat, layerName);
1692
+ outputBlobs.assign (umat);
1693
+ }
1694
+ }
1695
+ else if (outputBlobs.isMat ())
1696
+ {
1697
+ outputBlobs.assign (impl->getBlob (layerName));
1698
+ }
1699
+ else if (outputBlobs.isMatVector ())
1700
+ {
1701
+ if (ld.umat_outputBlobs .size () > 0 )
1702
+ {
1703
+ for (int i = 0 ; i < ld.umat_outputBlobs .size (); i++)
1704
+ ld.umat_outputBlobs [i].copyTo (ld.outputBlobs [i]);
1705
+ }
1706
+ std::vector<Mat> & outputvec = *(std::vector<Mat> *)outputBlobs.getObj ();
1707
+ outputvec = ld.outputBlobs ;
1708
+ }
1709
+ else if (outputBlobs.isUMatVector ())
1710
+ {
1711
+ if (ld.umat_outputBlobs .size () > 0 )
1712
+ {
1713
+ std::vector<UMat> & outputvec = *(std::vector<UMat> *)outputBlobs.getObj ();
1714
+ outputvec = ld.umat_outputBlobs ;
1715
+ }
1665
1716
}
1666
-
1667
- outputBlobs = ld.outputBlobs ;
1668
1717
}
1669
1718
1670
- void Net::forward (std::vector<Mat>& outputBlobs,
1719
+ void Net::forward (OutputArrayOfArrays outputBlobs,
1671
1720
const std::vector<String>& outBlobNames)
1672
1721
{
1673
1722
CV_TRACE_FUNCTION ();
1674
1723
1675
1724
std::vector<LayerPin> pins;
1676
1725
for (int i = 0 ; i < outBlobNames.size (); i++)
1677
1726
{
1678
- pins.push_back (impl->getPinByAlias (outBlobNames[i]));
1727
+ pins.push_back (impl->getPinByAlias (outBlobNames[i]));
1679
1728
}
1680
1729
1681
1730
impl->setUpNet (pins);
@@ -1684,11 +1733,14 @@ void Net::forward(std::vector<Mat>& outputBlobs,
1684
1733
1685
1734
impl->forwardToLayer (impl->getLayerData (out.lid ));
1686
1735
1687
- outputBlobs. clear () ;
1736
+ std::vector<Mat> matvec ;
1688
1737
for (int i = 0 ; i < pins.size (); i++)
1689
1738
{
1690
- outputBlobs .push_back (impl->getBlob (pins[i]));
1739
+ matvec .push_back (impl->getBlob (pins[i]));
1691
1740
}
1741
+
1742
+ std::vector<Mat> & outputvec = *(std::vector<Mat> *)outputBlobs.getObj ();
1743
+ outputvec = matvec;
1692
1744
}
1693
1745
1694
1746
void Net::forward (std::vector<std::vector<Mat> >& outputBlobs,
0 commit comments