经过两天的努力,在win10上终于是把点云图像给调出来了,本人采用的图漾科技的双目摄像头。但是很遗憾的是一运行出来就很卡,电脑崩溃。(点云的数据量太大了估计是,再有就是电脑太菜)。
一开始一直出现这个问题。
这个问题的主要原因是在配置pcl时的环境变量的问题。俗话说发现一个问题比解决十个问题更重要。
效果图:
干货代码:
#include<percipio_camport.h>
#include<opencv2/opencv.hpp>
#include<iostream>
#include<pcl/visualization/cloud_viewer.h>
void process_frames(percipio::DepthCameraDevice &port);
void CopyBuffer(percipio::ImageBuffer *pbuf, cv::Mat &img);
static cv::Mat point_cloud;
//点云图的显示
pcl::visualization::CloudViewer* m_pPCLViewer;
pcl::PointCloud<pcl::PointXYZ>::Ptr m_pPointCloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointXYZRGB>::Ptr m_pColorPointCloud(new pcl::PointCloud<pcl::PointXYZRGB>);
void show(int width, int height, int bpp, const unsigned char* data);
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer);
int main()
{
int ret;
percipio::DepthCameraDevice device;
ret = device.OpenDevice();
if (ret != percipio::CAMSTATUS_SUCCESS)
{
printf("Open device failed\n");
return -1;
}
printf("Open device Success\n");
ret = device.SetProperty_Int(percipio::PROP_WORKMODE, percipio::WORKMODE_DEPTH);
if (ret < 0)
{
printf("Set work-mode failer\n");
return -1;
}
printf("Set work-mode success\n");
ret = device.SetPointCloudOutput(true);
if (ret < 0)
{
printf("SetPointCloudput failed error code\n");
}
printf("SetPointCloudput success\n");
while (true)
{
int k = cv::waitKey(1);
if (k == 'q' || k == 1048689)
break;
ret = device.FramePackageGet();
if (ret != percipio::CAMSTATUS_SUCCESS)
{
printf("failed in FramePackageget()\n");
return -1;
}
process_frames(device);
}//while
delete m_pPCLViewer;
device.CloseDevice();
return 0;
}
void process_frames(percipio::DepthCameraDevice &port)
{
int ret;
percipio::ImageBuffer pimage;
ret =port.FrameGet(percipio::CAMDATA_POINT3D, &pimage);
if (percipio::CAMSTATUS_SUCCESS == ret)
{
CopyBuffer(&pimage, point_cloud);
cv::imshow("point_cloud", point_cloud);
show(pimage.width,pimage.height,pimage.get_pixel_size(),pimage.data);
}
}
void CopyBuffer(percipio::ImageBuffer *pbuf, cv::Mat &img)
{
switch (pbuf->type) {
case percipio::ImageBuffer::PIX_8C1:
img.create(pbuf->height, pbuf->width, CV_8UC1);
break;
case percipio::ImageBuffer::PIX_16C1:
img.create(pbuf->height, pbuf->width, CV_16UC1);
break;
case percipio::ImageBuffer::PIX_8C3:
img.create(pbuf->height, pbuf->width, CV_8UC3);
break;
case percipio::ImageBuffer::PIX_32FC3:
img.create(pbuf->height, pbuf->width, CV_32FC3);
break;
default:
img.release();
return;
}
memcpy(img.data, pbuf->data, pbuf->width * pbuf->height * pbuf->get_pixel_size());
}
void show(int width, int height, int bpp, const unsigned char* data)
{
m_pPCLViewer = NULL;
float* points = (float*)data;
size_t image_size = width*height;
const char* win_name = "Percipio PointCloud";
static bool bFirst = false;
if (!m_pPCLViewer)
{
m_pPCLViewer = new pcl::visualization::CloudViewer(win_name);
bFirst = true;
}
m_pPointCloud->resize(0);
for (size_t i = 0; i<image_size; ++i)
{
m_pPointCloud->push_back(pcl::PointXYZ(points[0], points[1], points[2]));
points += 3;
}
m_pPCLViewer->showCloud(m_pPointCloud, win_name);
if (bFirst)
{
m_pPCLViewer->runOnVisualizationThreadOnce(viewerOneOff);
bFirst = false;
}
}
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor(0.0, 0.0, 0.0);
viewer.setCameraPosition(0, 0, 0, 0, 0, 1, 0, -1, 0);
viewer.resetCamera();
}
希望可以给大家带来一些帮助。欢迎各位大神前来交流。。