3,882
社区成员
发帖
与我相关
我的任务
分享
#include <iostream>
#include <highgui.h>
#include <cv.h>
#include <fstream>
#include <sstream>
using namespace std;
using namespace cv;
#define FCount 10
#define ISizeX 352
#define ISizeY 288
unsigned char Y[FCount][ISizeY][ISizeX];
unsigned char buf[FCount][ISizeX*ISizeY+ISizeX/2*ISizeY/2+ISizeX/2*ISizeY/2+1];
// 将图片文件写入
void FileWriteFrames(){
char *filename = "E:\\openCV\\zhang\\yuvSource\\football_cif.yuv";
ifstream readMe(filename, ios::in | ios::binary); // 打开并读yuv数据
IplImage *image, *rgbimg, *yimg, *uimg, *vimg, *uuimg, *vvimg;
cvNamedWindow("yuv",CV_WINDOW_AUTOSIZE);
rgbimg = cvCreateImage(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 3);
image = cvCreateImage(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 3);
yimg = cvCreateImageHeader(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 1); // 亮度分量
uimg = cvCreateImageHeader(cvSize(ISizeX/2, ISizeY/2), IPL_DEPTH_8U, 1); // 这两个都是色度分量
vimg = cvCreateImageHeader(cvSize(ISizeX/2, ISizeY/2), IPL_DEPTH_8U, 1);
uuimg = cvCreateImage(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 1);
vvimg = cvCreateImage(cvSize(ISizeX, ISizeY), IPL_DEPTH_8U, 1);
int nframes;
for(nframes = 0; nframes < FCount; nframes ++){
char nframesstr[20];
readMe.read((char*)Y[nframes],ISizeX*ISizeY);
readMe.seekg(-ISizeX*ISizeY, ios::cur);
readMe.read((char*)buf[nframes],ISizeX*ISizeY+ISizeX/2*ISizeY/2+ISizeX/2*ISizeY/2);
cvSetData(yimg,Y[nframes],ISizeX);
cvSetData(uimg,buf[nframes] + ISizeX*ISizeY, ISizeX/2);
cvSetData(vimg,buf[nframes] + long(ISizeX*ISizeY*1.25), ISizeX/2);
cvResize(uimg,uuimg, CV_INTER_LINEAR);
cvResize(vimg,vvimg, CV_INTER_LINEAR);
cvMerge(yimg,uuimg,vvimg,NULL,image); // 合并单通道为三通道
cvCvtColor(image,rgbimg,CV_YCrCb2RGB);
stringstream ss; // 类型转换统一转换为char* 类型
ss << nframes;
ss << ".jpg" ;
ss >> nframesstr;
cvShowImage("yuv", rgbimg);
cvSaveImage(nframesstr,rgbimg);
int c = cvWaitKey(30);
if((char)c == 27)
{
break;
}
}
readMe.close();
cvReleaseImage(&uuimg);
cvReleaseImage(&vvimg);
cvReleaseImageHeader(&yimg);
cvReleaseImageHeader(&uimg);
cvReleaseImageHeader(&vimg);
cvReleaseImage(&image);
cvDestroyWindow("yuv");
}
int main()
{
FileWriteFrames();
return 0;
}
[/quote]你的意思是我不能用CvtColor(image,rgbimg,CV_YCrCb2RGB);进行转换,得换成你所对应的公式吗?[/quote]
是的,另外别听直接保存YUV的图片了,没有图片使用YUV存储的。我表示对此事无语。
变成这样了
[/quote]你的意思是我不能用CvtColor(image,rgbimg,CV_YCrCb2RGB);进行转换,得换成你所对应的公式吗?
cvShowImage("yuv", rgbimg);
不是YUV格式的吗,是否采用了RGB格式显示?没用过C++处理图像,只玩过Matlab....