The*_*own 17 c++ memory opencv
openCV中的两个函数cvLoadImage和cvSaveImage接受文件路径作为参数.
例如,保存图像时,它是cvSaveImage("/ tmp/output.jpg",dstIpl),并在磁盘上写入.
有没有办法在内存中提供这个缓冲区?因此,输出图像将在内存中,而不是磁盘写入.
我还想知道cvSaveImage和cvLoadImage(读取和写入内存缓冲区).谢谢!
我的目标是将文件的Encoded(jpeg)版本存储在Memory中.同样适用于cvLoadImage,我想将内存中的jpeg加载到IplImage格式中.
cod*_*eDr 17
这对我有用
// decode jpg (or other image from a pointer)
// imageBuf contains the jpg image
cv::Mat imgbuf = cv::Mat(480, 640, CV_8U, imageBuf);
cv::Mat imgMat = cv::imdecode(imgbuf, CV_LOAD_IMAGE_COLOR);
// imgMat is the decoded image
// encode image into jpg
cv::vector<uchar> buf;
cv::imencode(".jpg", imgMat, buf, std::vector<int>() );
// encoded image is now in buf (a vector)
imageBuf = (unsigned char *) realloc(imageBuf, buf.size());
memcpy(imageBuf, &buf[0], buf.size());
// size of imageBuf is buf.size();
Run Code Online (Sandbox Code Playgroud)
我被问及C版而不是C++:
#include <opencv/cv.h>
#include <opencv/highgui.h>
int
main(int argc, char **argv)
{
char *cvwin = "camimg";
cvNamedWindow(cvwin, CV_WINDOW_AUTOSIZE);
// setup code, initialization, etc ...
[ ... ]
while (1) {
// getImage was my routine for getting a jpeg from a camera
char *img = getImage(fp);
CvMat mat;
// substitute 640/480 with your image width, height
cvInitMatHeader(&mat, 640, 480, CV_8UC3, img, 0);
IplImage *cvImg = cvDecodeImage(&mat, CV_LOAD_IMAGE_COLOR);
cvShowImage(cvwin, cvImg);
cvReleaseImage(&cvImg);
if (27 == cvWaitKey(1)) // exit when user hits 'ESC' key
break;
}
cvDestroyWindow(cvwin);
}
Run Code Online (Sandbox Code Playgroud)
M45*_*456 15
libn的SVN版本中有几个未记录的函数:
CV_IMPL CvMat* cvEncodeImage( const char* ext,
const CvArr* arr, const int* _params )
CV_IMPL IplImage* cvDecodeImage( const CvMat* _buf, int iscolor )
Run Code Online (Sandbox Code Playgroud)
最新的签入消息表明它们用于bmp,png,ppm和tiff(仅编码)的本机编码/解码.
或者,您可以使用标准图像编码库(例如libjpeg)并操纵IplImage中的数据以匹配编码库的输入结构.