用kinect录视频库
来源:互联网 发布:李连杰国际影响力 知乎 编辑:程序博客网 时间:2024/05/16 00:45
~~有兴趣的小伙伴,加kinect算法交流群:462964980。
kinect深度视频去噪
kinectmod32.dll
http://pan.baidu.com/s/1DsGqX
下载后改名kinect.dll
替换掉Redist\OpenNI2\Drivers\kinect.dll
代码:
1 /* 2 * ===================================================================================== 3 * 4 * Filename: first_auoto_record.cpp 5 * 6 * Description: 7 * kinect自动录像,用于采集视频数据库,录制的视频每小段长为5min,(由子线程的模拟键盘延时决定,不同机器获取的视频长度不一样) 8 * 9 * 10 * 11 * Version: 1.0 12 * Created: 2013/10/14 16:37:10 13 * Revision: none 14 * Compiler: gcc 15 * 16 * Author: @礼杨_HDU (), yuliyang@qq.com 17 * Organization: 18 * 19 * ===================================================================================== 20 */ 21 #include <stdlib.h> 22 #include <windows.h> 23 #include <iostream> 24 #include <conio.h> 25 #include <string> 26 #include "OpenNI.h" 27 #include "opencv2/core/core.hpp" 28 #include "opencv2/highgui/highgui.hpp" 29 #include "opencv2/imgproc/imgproc.hpp" 30 31 #define RESOLUTION 640,480 32 #define RECORDRESOLUTION 590,440 33 #define ADRESOLUTION 45,40,590,440 34 #define FPS 20 35 #define GRAYTH 10 36 #define REPAIRERANGE 5 37 #define COLORTH 10 38 39 using namespace std; 40 using namespace cv; 41 using namespace openni; 42 /* 43 * === FUNCTION ====================================================================== 44 * Name: 子线程 45 * Description: 使用子进程给自己发送按键消息 46 * ===================================================================================== 47 */ 48 DWORD WINAPI ThreadFunction(LPVOID lpParameter) 49 { 50 printf("in thread......"); 51 while (TRUE){ 52 //your code 53 54 INPUT Input1 = { 0 }; 55 Input1.type = INPUT_KEYBOARD; 56 Input1.mi.dwFlags = KEYEVENTF_EXTENDEDKEY; 57 Input1.ki.wVk = 0x20; // 0 58 SendInput( 1, &Input1, sizeof( INPUT ) ); 59 INPUT Input2 = { 0 }; 60 Input2.type = INPUT_KEYBOARD; 61 Input2.mi.dwFlags = KEYEVENTF_EXTENDEDKEY; 62 Input2.ki.wVk = 0x0d; // 回车 63 SendInput( 1, &Input2, sizeof( INPUT ) ); 64 Sleep(300000);//每5分钟发送一个按键消息,即录下一段视频 65 } 66 return true; 67 } 68 69 /******************************************** 70 Global variable 71 ********************************************/ 72 //Openni status 73 Status result = STATUS_OK; 74 // open device 75 Device device; 76 //OpenNI2 image 77 VideoFrameRef oniDepthImg; 78 VideoFrameRef oniColorImg; 79 // create stream 80 VideoStream oniDepthStream; 81 VideoStream oniColorStream; 82 // set video mode 83 VideoMode modeDepth; 84 VideoMode modeColor; 85 //OpenCV image 86 cv::Mat cvDepthImg; 87 cv::Mat cvDepthImg2; 88 cv::Mat cvColorImg; 89 cv::Mat cvColorImg2; 90 //OpenCV adjusted image 91 cv::Mat cvAdjustDepthImg; 92 cv::Mat cvAdjustColorImg; 93 //Resolution 94 Size se=Size(RESOLUTION); 95 Size recordse=Size(RECORDRESOLUTION); 96 /********************************************* 97 function declaration 98 *********************************************/ 99 void CheckOpenNIError( Status result, string status ) 100 { 101 if( result != STATUS_OK ) 102 cerr << status << " Error: " << OpenNI::getExtendedError() << endl; 103 } 104 void iniOpenNI(void );//初始化OpenNI105 void releaseResource(void );//释放资源106 void OringinCapture(void );//107 void RemoveNoiseCapture(void );//108 void OringinRecord(void );//普通录制视频(640,480),录制深度视频(没有去噪)和彩色视频109 void RemoveNoiseRecord(void );//录制去噪后的视频,深度视频(未去噪)、深度视频(去噪)、彩色视频110 void RemoveNoise(void );//去除深度图像中的噪音111 bool pixelRepaire(int ,int ,int );//修复空洞像素点112 bool rangeRepaire(int ,int ,int );//范围修复113 void RepaireTest(void );114 void Test(void );115 116 117 int main( int argc, char** argv ) 118 { 119 HANDLE hT=CreateThread(NULL,0,ThreadFunction,NULL,0,NULL);120 iniOpenNI();121 //OringinCapture();122 //RemoveNoiseCapture();123 //OringinRecord();124 125 RemoveNoiseRecord();126 releaseResource();127 //RepaireTest();128 //Test();129 return 0; 130 }131 //132 void iniOpenNI()133 {134 // initialize OpenNI2 135 result = OpenNI::initialize(); 136 CheckOpenNIError( result, "initialize context" ); 137 138 //open video device139 result = device.open( openni::ANY_DEVICE ); 140 CheckOpenNIError( result, "initialize context" ); 141 142 //creat depth stream143 result = oniDepthStream.create( device, openni::SENSOR_DEPTH ); 144 CheckOpenNIError( result, "initialize context" ); 145 //set depth mode146 modeDepth.setResolution( RESOLUTION ); 147 modeDepth.setFps( FPS ); 148 modeDepth.setPixelFormat( PIXEL_FORMAT_DEPTH_1_MM ); 149 oniDepthStream.setVideoMode(modeDepth); 150 // start depth stream 151 result = oniDepthStream.start(); 152 CheckOpenNIError( result, "initialize context" ); 153 154 // create color stream 155 result = oniColorStream.create( device, openni::SENSOR_COLOR ); 156 CheckOpenNIError( result, "initialize context" ); 157 // set color video mode 158 modeColor.setResolution( RESOLUTION ); 159 modeColor.setFps( FPS ); 160 modeColor.setPixelFormat( PIXEL_FORMAT_RGB888 ); 161 oniColorStream.setVideoMode( modeColor); 162 // start color stream 163 result = oniColorStream.start(); 164 CheckOpenNIError( result, "initialize context" ); 165 166 // set depth and color imge registration mode 167 if( device.isImageRegistrationModeSupported(IMAGE_REGISTRATION_DEPTH_TO_COLOR ) ) 168 { 169 cout << "support" << endl;170 device.setImageRegistrationMode( IMAGE_REGISTRATION_DEPTH_TO_COLOR ); 171 } 172 173 }174 //175 void releaseResource()176 {177 //OpenNI2 destroy 178 oniDepthStream.destroy(); 179 oniColorStream.destroy(); 180 device.close(); 181 OpenNI::shutdown(); 182 }183 //184 void OringinCapture()185 {186 char DepthFilename[20];187 char ColorFilename[20];188 int n=0;189 while(true)190 {191 if( oniColorStream.readFrame( &oniColorImg ) == STATUS_OK ) 192 { 193 // convert data into OpenCV type 194 cv::Mat cvRGBImg( oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData() ); 195 cvtColor(cvRGBImg,cvColorImg,CV_RGB2GRAY);196 //cv::cvtColor( cvRGBImg, cvColorImg, CV_RGB2BGR ); 197 //colorVideoWriter.write(cvColorImg);198 } 199 if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK ) 200 { 201 cv::Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() ); 202 cvRawImg16U.convertTo( cvDepthImg, CV_8UC1, 255.0/(oniDepthStream.getMaxPixelValue())); 203 //【5】 204 // convert depth image GRAY to BGR 205 //cv::cvtColor(cvDepthImg,cvDepthImg,CV_GRAY2BGR); 206 //depthVideoWriter.write(cvDepthImg);207 } 208 cvAdjustDepthImg=Mat(cvDepthImg,Rect(ADRESOLUTION));209 cvAdjustColorImg=Mat(cvColorImg,Rect(ADRESOLUTION));210 if(_kbhit())//_kbhit()211 {212 n++;213 sprintf(DepthFilename,"depthimage%03d.jpg",n);214 sprintf(ColorFilename,"colorimage%03d.jpg",n);215 imwrite(DepthFilename,cvAdjustDepthImg);216 imwrite(ColorFilename,cvAdjustColorImg);217 cout << "已经保存了" << n << "副图片" << endl;218 system("PAUSE");219 }220 imshow("depth",cvAdjustDepthImg);221 imshow("color",cvAdjustColorImg);222 waitKey(2);223 }224 }225 //226 void RemoveNoiseCapture()227 {228 char DepthFilename[20];229 char ColorFilename[20];230 int n=0;231 while(true)232 {233 if( oniColorStream.readFrame( &oniColorImg ) == STATUS_OK ) 234 { 235 // convert data into OpenCV type 236 cv::Mat cvRGBImg( oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData() ); 237 cvtColor(cvRGBImg,cvColorImg,CV_RGB2GRAY);238 //cv::cvtColor( cvRGBImg, cvColorImg, CV_RGB2BGR ); 239 //colorVideoWriter.write(cvColorImg);240 } 241 if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK ) 242 { 243 cv::Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() ); 244 cvRawImg16U.convertTo( cvDepthImg, CV_8UC1, 255.0/(oniDepthStream.getMaxPixelValue())); 245 //【5】 246 // convert depth image GRAY to BGR 247 //cv::cvtColor(cvDepthImg,cvDepthImg,CV_GRAY2BGR); 248 //depthVideoWriter.write(cvDepthImg);249 } 250 cvAdjustDepthImg=Mat(cvDepthImg,Rect(ADRESOLUTION));251 cvAdjustColorImg=Mat(cvColorImg,Rect(ADRESOLUTION));252 if(_kbhit())//_kbhit()253 {254 n++;255 sprintf(DepthFilename,"depthimage%03d.jpg",n);256 sprintf(ColorFilename,"colorimage%03d.jpg",n);257 imwrite(DepthFilename,cvAdjustDepthImg);258 imwrite(ColorFilename,cvAdjustColorImg);259 cout << "已经保存了" << n << "副图片" << endl;260 system("PAUSE");261 }262 imshow("depth",cvAdjustDepthImg);263 imshow("color",cvAdjustColorImg);264 waitKey(2);265 }266 267 }268 //269 void OringinRecord()270 {271 int n=0;272 int operation;273 char DepthFilename[20];274 char ColorFilename[20];275 while(true)276 {277 n++;278 sprintf(DepthFilename,"oringindepthvideo%03d.avi",n);279 sprintf(ColorFilename,"oringincolorvideo%03d.avi",n);280 VideoWriter colorVideoWriter=VideoWriter(ColorFilename,CV_FOURCC('X','V','I','D'),FPS,se);281 VideoWriter depthVideoWriter=VideoWriter(DepthFilename,CV_FOURCC('X','V','I','D'),FPS,se);282 namedWindow("彩色图",1); 283 namedWindow("深度图",1); 284 while(true) 285 { 286 if( oniColorStream.readFrame( &oniColorImg ) == STATUS_OK ) 287 { 288 // convert data into OpenCV type 289 cv::Mat cvRGBImg( oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData() ); 290 cv::cvtColor( cvRGBImg, cvColorImg, CV_RGB2BGR ); 291 colorVideoWriter.write(cvColorImg);292 cv::imshow( "彩色图", cvColorImg ); 293 } 294 if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK ) 295 { 296 cv::Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() ); 297 cvRawImg16U.convertTo( cvDepthImg, CV_8UC1, 255.0/(oniDepthStream.getMaxPixelValue())); 298 //【5】 299 // convert depth image GRAY to BGR 300 cv::cvtColor(cvDepthImg,cvDepthImg,CV_GRAY2BGR); 301 depthVideoWriter.write(cvDepthImg);302 cv::imshow( "深度图", cvDepthImg ); 303 } 304 int key;305 key=waitKey(100);306 if(key==32)307 {308 break;309 }310 } 311 destroyWindow("彩色图"); 312 destroyWindow("深度图"); 313 cout << "已经录制了" << n << "段视频" << endl;314 }315 }316 /* 317 * === FUNCTION ======================================================================318 * Name: removenoiserecord319 * Description: 包含录取彩色图像,去噪后的灰度图像,未去噪声的深度图像和去噪后的深度图像320 *321 * =====================================================================================322 */323 void RemoveNoiseRecord()324 {325 int n=0;326 327 char DepthFilename[20];328 char ColorFilename[20];329 char removeDepthFilename[20];330 char removeColorFilename[20];331 Mat t1;332 Mat t2;333 while(true)334 {335 n++;336 sprintf(removeDepthFilename,"removedepthvideo%03d.avi",n);337 sprintf(removeColorFilename,"removecolorvideo%03d.avi",n);338 sprintf(DepthFilename,"oringindepthvideo%03d.avi",n); /* 未去噪的深度图像 */339 sprintf(ColorFilename,"oringincolorvideo%03d.avi",n); /* 未去噪声的彩色图像 */340 341 342 VideoWriter removecolorVideoWriter=VideoWriter(removeColorFilename,CV_FOURCC('X','V','I','D'),FPS,recordse);343 VideoWriter removedepthVideoWriter=VideoWriter(removeDepthFilename,CV_FOURCC('X','V','I','D'),FPS,recordse);344 345 VideoWriter colorVideoWriter=VideoWriter(ColorFilename,CV_FOURCC('X','V','I','D'),FPS,se);346 VideoWriter depthVideoWriter=VideoWriter(DepthFilename,CV_FOURCC('X','V','I','D'),FPS,se);//347 namedWindow("去噪灰度图",1); 348 namedWindow("去噪深度图",1); 349 namedWindow("未去噪彩色图",1); 350 namedWindow("未去噪深度图",1);351 while(true) 352 {353 if( oniColorStream.readFrame( &oniColorImg ) == STATUS_OK ) 354 { 355 // convert data into OpenCV type 356 cv::Mat cvRGBImg( oniColorImg.getHeight(), oniColorImg.getWidth(), CV_8UC3, (void*)oniColorImg.getData() ); 357 cv::cvtColor( cvRGBImg, cvColorImg2, CV_RGB2BGR );358 cvColorImg2=Mat(cvColorImg2,Rect(ADRESOLUTION));359 colorVideoWriter.write(cvColorImg2);360 cv::imshow( "未去噪彩色图", cvColorImg2 ); 361 cvtColor(cvRGBImg,cvColorImg,CV_RGB2GRAY);362 //colorVideoWriter.write(cvColorImg);363 364 365 } 366 if( oniDepthStream.readFrame( &oniDepthImg ) == STATUS_OK ) 367 { 368 cv::Mat cvRawImg16U( oniDepthImg.getHeight(), oniDepthImg.getWidth(), CV_16UC1, (void*)oniDepthImg.getData() ); 369 cvRawImg16U.convertTo( cvDepthImg, CV_8UC1, 255.0/(oniDepthStream.getMaxPixelValue())); 370 cv::cvtColor(cvDepthImg,cvDepthImg2,CV_GRAY2BGR); 371 cvDepthImg2=Mat(cvDepthImg2,Rect(ADRESOLUTION));372 depthVideoWriter.write(cvDepthImg2);373 cv::imshow( "未去噪深度图", cvDepthImg2 ); 374 } 375 //调整图像尺寸376 cvAdjustDepthImg=Mat(cvDepthImg,Rect(ADRESOLUTION));377 cvAdjustColorImg=Mat(cvColorImg,Rect(ADRESOLUTION));378 379 380 381 RemoveNoise();382 cvtColor(cvAdjustColorImg,cvAdjustColorImg,CV_GRAY2BGR);383 cvtColor(cvAdjustDepthImg,cvAdjustDepthImg,CV_GRAY2BGR);384 removecolorVideoWriter.write(cvAdjustColorImg);385 removedepthVideoWriter.write(cvAdjustDepthImg);386 imshow("去噪灰度图",cvAdjustColorImg);387 imshow("去噪深度图",cvAdjustDepthImg);388 int key;389 key=waitKey(10);390 if(key==32)391 {392 break;393 }394 }395 destroyWindow("去噪灰度图"); 396 destroyWindow("去噪深度图"); 397 destroyWindow("未去噪彩色图"); 398 destroyWindow("未去噪深度图"); 399 400 cout << "已经录制了" << n << "段视频" << endl;401 }402 }403 //404 void RemoveNoise()405 {406 clock_t start,finish;407 double totaltime=0.0;408 start=clock();409 410 for(int j=(cvAdjustDepthImg.rows-1);j>=0;j--)//depthImage.rows,行数411 {412 const uchar* mj=cvAdjustDepthImg.ptr<uchar>(j);413 for(int i=(cvAdjustDepthImg.cols-1);i>=0;i--)//depthImage.cols,列数414 {415 //修复空洞416 if(mj[i]<=GRAYTH)417 {418 uchar colorpixel=cvAdjustColorImg.at<uchar>(j,i);419 bool reResult=false;420 //分黑色和非黑色区域分开处理421 if(colorpixel<GRAYTH*5)422 {423 //像素点修复424 for(int k=1;k<REPAIRERANGE*3;k++)425 {426 reResult=pixelRepaire(i,j,k);427 if(reResult)428 break;429 }430 //go down431 if(!reResult)432 {433 for(int k=1;k<=30;k++)434 {435 if((j+k)<440)436 {437 if(cvAdjustDepthImg.at<uchar>(j+k,i)>GRAYTH)438 {439 cvAdjustDepthImg.at<uchar>(j,i)=cvAdjustDepthImg.at<uchar>(j+k,i);440 reResult=true;441 break;442 }443 }444 else445 {446 break;447 }448 }449 }450 //go up451 if(!reResult)452 {453 for(int k=1;k<=30;k++)454 {455 if((j-k)>=0)456 {457 if(cvAdjustDepthImg.at<uchar>(j-k,i)>GRAYTH)458 {459 cvAdjustDepthImg.at<uchar>(j,i)=cvAdjustDepthImg.at<uchar>(j-k,i);460 reResult=true;461 break;462 }463 }464 else465 {466 break;467 }468 }469 }470 }471 else472 {473 //消除物体边界的噪音474 for(int k=1;k<30;k++)475 {476 if((i+k)<590 && !reResult)477 {478 if(abs(cvAdjustColorImg.at<uchar>(j,i+k)-colorpixel)<=COLORTH && cvAdjustDepthImg.at<uchar>(j,i+k)>GRAYTH)479 {480 cvAdjustDepthImg.at<uchar>(j,i)=cvAdjustDepthImg.at<uchar>(j,i+k);481 reResult=true;482 }483 }484 else485 {486 break;487 }488 } 489 }490 //像素点周围寻找可利用点(考虑彩色图像是否匹配)491 if(!reResult)492 {493 for(int k=1;k<REPAIRERANGE;k++)494 {495 reResult=pixelRepaire(i,j,k);496 if(reResult)497 break;498 }499 }500 //范围寻找可利用点(不管彩色图像是否匹配)501 if(!reResult)502 {503 for(int k=0;k<REPAIRERANGE*3;k++)504 {505 reResult=rangeRepaire(i,j,k);506 if(reResult)507 break;508 }509 }510 }511 }512 }513 514 515 finish=clock();516 totaltime=(double)(finish-start)/CLOCKS_PER_SEC;517 //cout<<"\n此帧图像的去噪时间为"<< totaltime << "秒!"<< endl;518 }519 //像素点修复520 bool pixelRepaire(int i,int j,int repaireRange)521 {522 uchar colorpixel=cvAdjustColorImg.at<uchar>(j,i);523 int x=0;524 int y=0;525 int n=0;//符合要求的点的数量526 int sum=0;//符合要求的点的灰度值的和527 for(y=j-repaireRange;y<=j+repaireRange;y++)528 {529 if(y>=0 && y<440)530 {531 //上下边界寻找532 if(y==(j-repaireRange) || y==(j+repaireRange))533 {534 for(x=i-repaireRange;x<=i+repaireRange;x++)535 {536 if(x>=0 && x<590)537 {538 if(abs(cvAdjustColorImg.at<uchar>(y,x)-colorpixel)<=COLORTH && cvAdjustDepthImg.at<uchar>(y,x)>GRAYTH)539 {540 n++;541 sum=sum+cvAdjustDepthImg.at<uchar>(y,x);542 }543 }544 545 }546 }547 //左右边界寻找548 else549 {550 //左551 x=i-repaireRange;552 if(x>=0 && x<590)553 {554 if(abs(cvAdjustColorImg.at<uchar>(y,x)-colorpixel)<=COLORTH && cvAdjustDepthImg.at<uchar>(y,x)>GRAYTH)555 {556 n++;557 sum=sum+cvAdjustDepthImg.at<uchar>(y,x);558 }559 }560 //右561 x=i+repaireRange;562 if(x>=0 && x<590)563 {564 if(abs(cvAdjustColorImg.at<uchar>(y,x)-colorpixel)<=COLORTH && cvAdjustDepthImg.at<uchar>(y,x)>GRAYTH)565 {566 n++;567 sum=sum+cvAdjustDepthImg.at<uchar>(y,x);568 }569 }570 }571 }572 573 }574 if(n<repaireRange*2)575 {return false;}576 else577 {578 cvAdjustDepthImg.at<uchar>(j,i)=(uchar)(sum/n);579 return true;580 }581 582 }583 //范围性修复584 bool rangeRepaire(int i,int j,int repaireRange)585 {586 uchar colorpixel=cvAdjustColorImg.at<uchar>(j,i);587 int x=0;588 int y=0;589 int n=0;590 int sum=0;591 for(y=j-repaireRange;y<=j+repaireRange;y++)592 {593 if(y>=0 && y<440)594 {595 for(x=i-repaireRange;x<=i+repaireRange;x++)596 {597 if(x>=0 && x<590)598 {599 if(cvAdjustDepthImg.at<uchar>(y,x)>GRAYTH)600 {601 n++;602 sum=sum+cvAdjustDepthImg.at<uchar>(y,x);603 }604 }605 }606 }607 }608 if(n<=repaireRange*2)609 {610 return false;611 }612 else613 {614 cvAdjustDepthImg.at<uchar>(j,i)=(uchar)(sum/n);615 return true;616 }617 }618 //619 void RepaireTest()620 {621 cvAdjustColorImg=imread("colorimage005.jpg",0);622 cvAdjustDepthImg=imread("depthimage005.jpg",0);623 Mat oriDepthImg=cvAdjustDepthImg.clone();624 clock_t start,finish;625 double totaltime=0.0;626 start=clock();627 for(int j=(cvAdjustDepthImg.rows-1);j>=0;j--)//depthImage.rows,行数628 {629 const uchar* mj=cvAdjustDepthImg.ptr<uchar>(j);630 for(int i=(cvAdjustDepthImg.cols-1);i>=0;i--)//depthImage.cols,列数631 {632 //修复空洞633 if(mj[i]<=GRAYTH)634 {635 uchar colorpixel=cvAdjustColorImg.at<uchar>(j,i);636 bool reResult=false;637 //分黑色和非黑色区域分开处理638 if(colorpixel<GRAYTH*5)639 {640 //像素点修复641 for(int k=1;k<REPAIRERANGE*3;k++)642 {643 reResult=pixelRepaire(i,j,k);644 if(reResult)645 break;646 }647 //go down648 if(!reResult)649 {650 for(int k=1;k<=30;k++)651 {652 if((j+k)<440)653 {654 if(cvAdjustDepthImg.at<uchar>(j+k,i)>GRAYTH)655 {656 cvAdjustDepthImg.at<uchar>(j,i)=cvAdjustDepthImg.at<uchar>(j+k,i);657 reResult=true;658 break;659 }660 }661 else662 {663 break;664 }665 }666 }667 //go up668 if(!reResult)669 {670 for(int k=1;k<=30;k++)671 {672 if((j-k)>=0)673 {674 if(cvAdjustDepthImg.at<uchar>(j-k,i)>GRAYTH)675 {676 cvAdjustDepthImg.at<uchar>(j,i)=cvAdjustDepthImg.at<uchar>(j-k,i);677 reResult=true;678 break;679 }680 }681 else682 {683 break;684 }685 }686 }687 }688 else689 {690 //消除物体边界的噪音691 for(int k=1;k<30;k++)692 {693 if((i+k)<590 && !reResult)694 {695 if(abs(cvAdjustColorImg.at<uchar>(j,i+k)-colorpixel)<=COLORTH && cvAdjustDepthImg.at<uchar>(j,i+k)>GRAYTH)696 {697 cvAdjustDepthImg.at<uchar>(j,i)=cvAdjustDepthImg.at<uchar>(j,i+k);698 reResult=true;699 }700 }701 else702 {703 break;704 }705 } 706 }707 //像素点周围寻找可利用点(考虑彩色图像是否匹配)708 if(!reResult)709 {710 for(int k=1;k<REPAIRERANGE;k++)711 {712 reResult=pixelRepaire(i,j,k);713 if(reResult)714 break;715 }716 }717 //范围寻找可利用点(不管彩色图像是否匹配)718 if(!reResult)719 {720 for(int k=0;k<REPAIRERANGE*3;k++)721 {722 reResult=rangeRepaire(i,j,k);723 if(reResult)724 break;725 }726 }727 }728 }729 }730 // for(int j=(cvAdjustDepthImg.rows-1);j>=0;j--)//depthImage.rows,行数731 // {732 // const uchar* mj=cvAdjustDepthImg.ptr<uchar>(j);733 // for(int i=(cvAdjustDepthImg.cols-1);i>=0;i--)//depthImage.cols,列数734 // {735 // //修复空洞736 // if(mj[i]<=GRAYTH)737 // {738 // uchar colorpixel=cvAdjustColorImg.at<uchar>(j,i);739 // bool reResult=false;740 // //从右向左寻找可利用点 741 // for(int k=1;k<30;k++)742 // {743 // if((i+k)<590 && !reResult)744 // {745 // if(abs(cvAdjustColorImg.at<uchar>(j,i+k)-colorpixel)<=COLORTH && cvAdjustDepthImg.at<uchar>(j,i+k)>GRAYTH)746 // {747 // cvAdjustDepthImg.at<uchar>(j,i)=cvAdjustDepthImg.at<uchar>(j,i+k);748 // reResult=true;749 // }750 // }751 // else752 // {753 // break;754 // }755 // } 756 // //像素点修复757 // if(!reResult)758 // {759 // for(int k=1;k<REPAIRERANGE;k++)760 // {761 // reResult=pixelRepaire(i,j,k);762 // if(reResult)763 // break;764 // }765 // }766 // }767 // }768 // }769 //ccc=cvAdjustDepthImg.clone();770 /*771 for(int j=(cvAdjustDepthImg.rows-1);j>=0;j--)//depthImage.rows,行数772 {773 const uchar* mj=cvAdjustDepthImg.ptr<uchar>(j);774 for(int i=(cvAdjustDepthImg.cols-1);i>=0;i--)//depthImage.cols,列数775 {776 //修复空洞777 if(mj[i]<=GRAYTH)778 {779 bool reResult;780 for(int k=1;k<=REPAIRERANGE;k++)781 {782 reResult=rangeRepaire(i,j,k);783 if(reResult)784 break;785 }786 }787 }788 }789 */790 //Mat xxx;791 //Mat zzz=cvAdjustDepthImg.clone();792 //GaussianBlur(cvAdjustDepthImg,xxx,Size(3,3),0,0);793 //bilateralFilter(cvAdjustDepthImg,xxx,3,5*2,5*2);794 finish=clock();795 totaltime=(double)(finish-start)/CLOCKS_PER_SEC;796 cout<<"\n此帧图像的去噪时间为"<< totaltime << "秒!"<< endl;797 imshow("去噪深度",cvAdjustDepthImg);798 imshow("深度",oriDepthImg);799 imshow("彩色",cvAdjustColorImg);800 waitKey();801 //system("PAUSE");802 803 }804 //805 void Test()806 {807 //cvColorImg=imread("colorimage003.jpg",0);808 //cout << (int)cvColorImg.at<uchar>(369,272) << endl ;809 //cout << (int)cvColorImg.at<uchar>(73,394) << endl ;810 //cout << (int)cvColorImg.at<uchar>(428,256) << endl ;811 //cout << (int)cvColorImg.at<uchar>(326,553) << endl ;812 cvAdjustColorImg=imread("colorimage003.jpg",0);813 cvAdjustDepthImg=imread("depthimage003.jpg",0);814 Mat t;815 addWeighted(cvAdjustDepthImg,0.8,cvAdjustColorImg,0.2,0,t);816 imshow("1",t);817 waitKey();818 }
在录视频中遇到的一个问题是录成的视频只有6K大小,花了我半天时间,原来是窗口大小的问题。
如果录取的原视频的大小也是要调整为
RECORDRESOLUTION 590,440的话colorVideoWriter里的参数不能为se,应该为 recordse否则就会有6k问题
0 0
- 用kinect录视频库
- Kinect入门学习视频
- xBox kinect视频汇总
- Kinect Kitchen 最终视频
- 录视频感想
- 我们也录视频
- android录视频
- 拍照、录视频
- Kinect 3D视频捕捉
- Kinect for Windows培训视频
- Android录屏命令、Android录Gif、Android录视频
- Android录屏命令、Android录Gif、Android录视频
- Android视录视频示例
- 拍照 录视频 小实例
- Android不预览录视频
- android -- MediaRecorder 自定义视频录
- Android拍照与录视频
- 使用Kinect V2进行录制视频
- Jsoup中文API
- 15个易遗忘的Java问题
- noip2014 生活大爆炸版 石头剪刀布 (模拟)
- IOS推送
- 用PhotoShop制作透明背景图片
- 用kinect录视频库
- [225]Implement Stack using Queues
- 回溯法总结
- NGS library construction(未完待续)
- Arduino与Processing串口通信问题
- MFC 托盘实现
- android开发--获取网络图片,读取进度条
- SpriteBuilder中CCB精灵对象的Sprite frame为什么有时候不能修改
- [225]Implement Stack using Queues