char*->IplImage、char*->Mat转换


/************************************************************************

flag==0: gray
flag==1: rgb
************************************************************************/
void CCvImg::IplImg2unchar(IplImage *pSrc, unsigned char *pImg, int nW, int nH,BOOL Flag)
{
if (Flag)
{
for (int j = 0; j<nH; j++)
{
memcpy(&pImg[j*nW*3],&pSrc->imageData[(nH-j-1)*nW*3],nW*3);
}
}
else
{
for (int j = 0; j<nH; j++)
{
memcpy(&pImg[j*nW],&pSrc->imageData[(nH-j-1)*nW],nW);
}
}
}
/************************************************************************
Flag==0: gray
Flag==1: rgb
************************************************************************/
void CCvImg::Unchar2IplImg(unsigned char *pImg, IplImage *pDis, int nW, int nH,BOOL Flag)
{
if (Flag)
{
for (int j = 0; j<nH; j++)
{
memcpy(&pDis->imageData[(nH-j-1)*nW*3],&pImg[j*nW*3],nW*3);
}
}
else
{
for (int j = 0; j<nH; j++)
{
memcpy(&pDis->imageData[(nH-j-1)*nW],&pImg[j*nW],nW);
}
}

}



char*->Mat

Mat mImage;
mImage.create(H, W, 8UC3);
memcpy(mImage.data, pImage, W * H * 3);

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
private slots: void on_open_video_btn_clicked(); void on_stop_video_btn_clicked(); void on_capture_btn_clicked(); void readFarme(); // 读取当前帧信息 void on_timeout_video_btn_clicked(); void on_keep_video_btn_clicked(); private: Ui::Widget *ui; QTimer *timer; QImage *imag; cv::VideoCapture *cam;// 视频获取结构, 用来作为视频获取函数的一个参数 cv::Mat frame;//申请IplImage类型指针,就是申请内存空间来存放每一帧图像 };根据以上代码修改以下代码void Widget::on_open_video_btn_clicked() { cam->open(0);//打开摄像头,从摄像头中获取视频 timer->start(30); //每30ms更新一次画面 QString fileName = QFileDialog::getSaveFileName(this, tr("Save Video"), ".", tr("Video Files (.avi)")); if (!fileName.isEmpty()) { int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');//设置视频编码格式 double fps = 30;//设置视频帧率 cv::VideoWriter writer(fileName.toStdString(), codec, fps, frame->size(), true);//创建VideoWriter对象 if (writer.isOpened()) { timer->stop();//停止更新画面 cam->release();//释放摄像头 while (true) //写入视频帧 { (*cam) >> (*frame);//继续读取下一帧 if(frame->empty()) { break;//如果没有帧,则退出循环 } cv::cvtColor(*frame,frame,cv::COLOR_BGR2RGB);//化为Qt的RGB格式 QByteArray imageData((const char)frame->data, frame->cols * frame->rows * frame->elemSize()); imag->loadFromData(imageData, frame->cols, frame->rows, QImage::Format_RGB888); ui->captrue_lab->setPixmap(QPixmap::fromImage(*imag));//将图片显示到label上 qApp->processEvents();//处理UI事件 writer.write(*frame); } } } }
最新发布
05-18
根据您提供的代码,有以下几点需要修改: 1. `QImage *imag`应该初始化为一个新的`QImage`对象,因为您在后面使用了`imag->loadFromData()`方法来加载图像数据。 2. `cv::Mat frame`是一个`cv::Mat`类型的对象,应该使用`frame.size()`方法获取宽度和高度,而不是使用`frame->size()`。 3. 在写入视频帧时,应该使用`writer.write(frame)`而不是`writer.write(*frame)`。 修改后的代码如下: ``` void Widget::on_open_video_btn_clicked() { cam->open(0);//打开摄像头,从摄像头中获取视频 timer->start(30); //每30ms更新一次画面 QString fileName = QFileDialog::getSaveFileName(this, tr("Save Video"), ".", tr("Video Files (.avi)")); if (!fileName.isEmpty()) { int codec = cv::VideoWriter::fourcc('M', 'J', 'P', 'G');//设置视频编码格式 double fps = 30;//设置视频帧率 cv::VideoWriter writer(fileName.toStdString(), codec, fps, frame.size(), true);//创建VideoWriter对象 if (writer.isOpened()) { timer->stop();//停止更新画面 cam->release();//释放摄像头 QImage *imag = new QImage(); while (true) //写入视频帧 { (*cam) >> frame;//继续读取下一帧 if(frame.empty()) { break;//如果没有帧,则退出循环 } cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB);//化为Qt的RGB格式 QByteArray imageData((const char*)frame.data, frame.cols * frame.rows * frame.elemSize()); imag->loadFromData(imageData, frame.cols, frame.rows, QImage::Format_RGB888); ui->captrue_lab->setPixmap(QPixmap::fromImage(*imag));//将图片显示到label上 qApp->processEvents();//处理UI事件 writer.write(frame); } delete imag; } } } ``` 希望这个修改可以帮到您!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值