如何将图像缓冲区传入OpenCV Mat对象?(PixeLINK相机C语言开发场景)
嘿,我把你这段PixeLINK USB3工业相机结合OpenCV的C++代码整理成清晰规范的Markdown格式了,方便你后续调试、参考和分享:
PixeLINK相机初始化与帧转OpenCV Mat核心实现
这段代码完成了相机初始化、启动数据流,并准备了帧缓冲区,是实现相机图像转OpenCV Mat 格式的基础部分,我也补全了代码里缺失的关键逻辑:
#include <opencv2/opencv.hpp> #include <PixeLINKApi.h> #include <vector> #include <cstdio> #include <cstdlib> using namespace cv; using namespace std; int main() { HANDLE hCamera; // 初始化相机(索引0表示第一个连接的相机) PXL_RETURN_CODE rc = PxLInitialize(0, &hCamera); if (!API_SUCCESS(rc)) { printf("Error: Unable to initialize a camera. \n"); return EXIT_FAILURE; } // 预分配帧缓冲区(按3000*3000的16位灰度图像预留空间,可根据相机参数调整) vector<U8> frameBuffer(3000 * 3000 * 2); FRAME_DESC frameDesc; // 启动相机数据流 if (API_SUCCESS(PxLSetStreamState(hCamera, START_STREAM))) { while (true) { frameDesc.uSize = sizeof(FRAME_DESC); // 获取最新一帧图像到缓冲区 rc = PxLGetNextFrame(hCamera, frameBuffer.size(), frameBuffer.data(), &frameDesc); if (API_SUCCESS(rc)) { // 将缓冲区数据转换为OpenCV Mat格式(假设相机输出16位单通道灰度图) Mat frame(frameDesc.uHeight, frameDesc.uWidth, CV_16UC1, frameBuffer.data()); // 这里可以添加图像显示、处理逻辑 imshow("PixeLINK Camera Feed", frame); // 按ESC键退出循环 if (waitKey(1) == 27) break; } } // 停止数据流 PxLSetStreamState(hCamera, STOP_STREAM); } // 释放相机资源 PxLUninitialize(hCamera); destroyAllWindows(); return 0; }
小提示
- 你可以根据相机实际输出的图像格式(比如8位彩色、多通道)调整
Mat的类型参数,比如彩色图可用CV_8UC3 - 编译时要记得链接PixeLINK SDK库和OpenCV的相关依赖库
- 循环里的
waitKey(1)是OpenCV窗口正常刷新的必要操作,避免程序假死
内容的提问来源于stack exchange,提问作者RBRS1982
相关产品推荐
相关产品推荐

