Umat Mat 相互轉換(apexcv學習心得一)

今天初次接觸關於恩智浦的芯片,發現裏面涉及apexcv部分知識,頭疼不已,現將學習的記錄下吧
1、讀入圖片
我們通過opencv讀入圖片,然後轉換成apexcv數據類型Vsdk Umat

vsdk::UMat image = cv::imread("in_color_256x256.png", CV_LOAD_IMAGE_COLOR).getUMat(cv::ACCESS_RW);

// read the image via OpenCV, internally convert to vsdk UMat
// during conversion, the non-OAL memory is detected, UMat allocates OAL Memory and copies data to be used in vsdk

2、保存圖片

// If the read image isn't contiguous (allocated on heap) when retyped to "image", this issue is detected, OAL memory is newly allocated and data copied internally
// Fast data copy TBD
{
vsdk::UMat image = cv::imread("in_color_256x256.png",
CV_LOAD_IMAGE_COLOR).getUMat(cv::ACCESS_RW);
// ... image is safe to be used by HW IP
cv::imwrite("out_color_256x256.png", (cv::UMat)image);
}

3、內存分配問題

{
vsdk::UMat image; // An empty UMat instance is created
image = vsdk::UMat(HEIGHT, WIDTH, DATA_TYPE);
// When created, memory is allocated via OAL
{
vsdk::UMat image2 = image;
// When assigned, no change happens in underlying structure,
// reference count is increased
}
} // When destroyed last reference, the data are freed from OAL heap

4、UMat in ACF

vsdk::UMat image = cv::imread("in_color_256x256.png", CV_LOAD_IMAGE_COLOR).getUMat(cv::ACCESS_RW);
if (!image.empty())
{
// Init the rest of ports
vsdk::UMat out(image.rows, image.cols, VSDK_CV_8UC3);
vsdk::UMat dataThreshold(1, 1, VSDK_CV_8UC1);
vsdk::UMat dataMarkColorChannel(1, 1, VSDK_CV_8UC1);
// Init the algorithm parameters. Note the Mat is created just for this
// call,
// it's destroyed afterwards and flushed
dataThreshold.getMat(OAL_USAGE_CACHED).at<unsigned char>(0) = THRESHOLD;
dataMarkColorChannel.getMat(OAL_USAGE_CACHED).at<unsigned char>(0) =
COLOR_CHANNEL;
// Init the ACF process
APU_FAST9_COLOR process;
lRetVal |= process.Initialize();
lRetVal |= process.ConnectIO("INPUT", image);
lRetVal |= process.ConnectIO("THRESHOLD", dataThreshold);
lRetVal |= process.ConnectIO("MARK_COLOR_CHANNEL", dataMarkColorChannel);
lRetVal |= process.ConnectIO("OUTPUT", out);
// execute
lRetVal |= process.Start();
lRetVal |= process.Wait();
// Save the output
cv::imwrite("out_color_256x256.png", (cv::UMat)out);
}

SDI視頻讀取

/* SDI frame processing */
sdi_grabber lGrabber;
// ... SDI init
// Grabbing loop
while(1)
{
SDI_Frame lFrame = lGrabber.FramePop();
// UMat is in lFrame.UMat
if (!lFrame.mUMat.empty()
{
// UMat processing
*****************************
        處理算法
********************************
}
// We need to push the buffer back
lGrabber.FramePush(lFrame);
}

Umat Mat 相互轉換
1、UMat轉換成Mat
可以使用UMat::copyTo(OutputArray dst),也可以使用Mat::getMat(int access_flags)。
使用copyTo

Mat mat = imread("image.jpg", IMREAD_COLOR);
// Copy Mat to UMat
UMat umat;
mat.copyTo(umat);
// Copy UMat to Mat
Mat mat;
umat.copyTo(mat2);
//或者使用
 getMatMat mat = imread("image.jpg", IMREAD_COLOR);// Get umat from matUmat
 umat = mat.getUMat(flag);// Get mat from umat
 Mat mat2 = umat.getMat(flag);

2、Mat轉換成UMat
可以使用Mat::copyTo(OutputArray dst),也可以使用Mat::getUMat(int access_flags)。使用

copyToMat mat = imread("image.jpg", IMREAD_COLOR);// Copy Mat toUMat 
UMat umat;mat.copyTo(umat);
//或者使用getUMat
Mat mat = imread("image.jpg", IMREAD_COLOR);// Get umat from mat
Umat umat = mat.getUMat(flag);
//其中flag可以取ACESS_READ, ACESS_WRITE, ACESS_RW和ACESS_FAST
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章