我正在使用LSD来检测图像中的直线,我下载的代码包含调用LSD的最小示例,但它是静态的(即它只输出main函数中的值)我想应用代码在视频上,这是输出静态结果的最小示例。
#include <stdio.h>
#include "lsd.h"
int main(void)
{
image_double image;
ntuple_list out;
unsigned int x,y,i,j;
unsigned int X = 512; /* x image size */
unsigned int Y = 512; /* y image size */
/* create a simple image: left half black, right half gray */
image = new_image_double(X,Y);
for(x=0;x<X;x++)
for(y=0;y<Y;y++)
image->data[ x + y * image->xsize ] = x<X/2 ? 0.0 : 64.0; /* image(x,y) */
IplImage* imgInTmp = cvLoadImage("C:\Documents and Settings\Eslam farag\My Documents\Visual Studio 2008\Projects\line\hand.JPEG", 0);
/* call LSD */
out = lsd(image);
/* print output */
printf("%u line segments found:\n",out->size);
for(i=0;i<out->size;i++)
{
for(j=0;j<out->dim;j++)
printf("%f ",out->values[ i * out->dim + j ]);
printf("\n");
}
/* free memory */
free_image_double(image);
free_ntuple_list(out);
return 0;
}
如果有人可以帮助我在视频上应用代码,我会很高兴。谢谢 最好的问候,
答案 0 :(得分:3)
由于我找不到完整的示例,我正在共享我编写的代码,该代码使用OpenCV从磁盘加载视频文件并对其执行一些图像处理。
应用程序将 filename 作为输入(在cmd行上),并使用OpenCV内置函数cvCvtColor()
将视频的每一帧转换为等效的灰度等级。< / p>
我在代码中添加了一些注释,以帮助您理解基本任务。
<强> read_video.cpp 强>:
#include <stdio.h>
#include <highgui.h>
#include <cv.h>
int main(int argc, char* argv[])
{
cvNamedWindow("video", CV_WINDOW_AUTOSIZE);
CvCapture *capture = cvCaptureFromAVI(argv[1]);
if(!capture)
{
printf("!!! cvCaptureFromAVI failed (file not found?)\n");
return -1;
}
IplImage* frame;
char key = 0;
while (key != 'q') // Loop for querying video frames. Pressing Q will quit
{
frame = cvQueryFrame( capture );
if( !frame )
{
printf("!!! cvQueryFrame failed\n");
break;
}
/* Let's do a grayscale conversion just 4 fun */
// A grayscale image has only one channel, and most probably the original
// video works with 3 channels (RGB). So, for the conversion to work, we
// need to allocate an image with only 1 channel to store the result of
// this operation.
IplImage* gray_frame = 0;
gray_frame = cvCreateImage(cvSize(frame->width, frame->height), frame->depth, 1);
if (!gray_frame)
{
printf("!!! cvCreateImage failed!\n" );
return -1;
}
cvCvtColor(frame, gray_frame, CV_RGB2GRAY); // The conversion itself
// Display processed frame on window
cvShowImage("video", gray_frame);
// Release allocated resources
cvReleaseImage(&gray_frame);
key = cvWaitKey(33);
}
cvReleaseCapture(&capture);
cvDestroyWindow("video");
}
编译:
g++ read_video.cpp -o read `pkg-config --cflags --libs opencv`
如果您想知道如何迭代帧的像素来进行自定义处理,则需要检查以下答案,因为它显示了如何进行手动灰度转换。你去:OpenCV cvSet2d.....what does this do
答案 1 :(得分:1)
这里是使用LSD和opencv
的代码示例#include "lsd.h"
void Test_LSD(IplImage* img)
{
IplImage* grey = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
cvCvtColor(img, grey, CV_BGR2GRAY);
image_double image;
ntuple_list out;
unsigned int x,y,i,j;
image = new_image_double(img->width,img->height);
for(x=0;x<grey->width;x++)
for(y=0;y<grey->height;y++)
{
CvScalar s= cvGet2D(grey,y,x);
double pix= s.val[0];
image->data[ x + y * image->xsize ]= pix; /* image(x,y) */
}
/* call LSD */
out = lsd(image);
//out= lsd_scale(image,1);
/* print output */
printf("%u line segments found:\n",out->size);
vector<Line> vec;
for(i=0;i<out->size;i++)
{
//for(j=0;j<out->dim;j++)
{
//printf("%f ",out->values[ i * out->dim + j ]);
Line line;
line.x1= out->values[ i * out->dim + 0];
line.y1= out->values[ i * out->dim + 1];
line.x2= out->values[ i * out->dim + 2];
line.y2= out->values[ i * out->dim + 3];
vec.push_back(line);
}
//printf("\n");
}
IplImage* black= cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
cvZero(black);
draw_lines(vec,black);
/*cvNamedWindow("img", 0);
cvShowImage("img", img);*/
cvSaveImage("lines_detect.png",black/*img*/);
/* free memory */
free_image_double(image);
free_ntuple_list(out);
}
或者这样
IplImage* get_lines(IplImage* img,vector<Line>& vec_lines)
{
//to grey
//IplImage* grey = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
//cvCvtColor(img, grey, CV_BGR2GRAY);
image_double image;
ntuple_list out;
unsigned int x,y,i,j;
image = new_image_double(img->width,img->height);
for(x=0;x</*grey*/img->width;x++)
for(y=0;y</*grey*/img->height;y++)
{
CvScalar s= cvGet2D(/*grey*/img,y,x);
double pix= s.val[0];
image->data[ x + y * image->xsize ]= pix;
}
/* call LSD */
out = lsd(image);
//out= lsd_scale(image,1);
/* print output */
//printf("%u line segments found:\n",out->size);
//vector<Line> vec;
for(i=0;i<out->size;i++)
{
//for(j=0;j<out->dim;j++)
{
//printf("%f ",out->values[ i * out->dim + j ]);
Line line;
line.x1= out->values[ i * out->dim + 0];
line.y1= out->values[ i * out->dim + 1];
line.x2= out->values[ i * out->dim + 2];
line.y2= out->values[ i * out->dim + 3];
/*vec*/vec_lines.push_back(line);
}
//printf("\n");
}
IplImage* black= cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
cvZero(black);
for(int i=0;i<vec_lines.size();++i)
{
//if(vec[i].x1==vec[i].x2||vec[i].y1==vec[i].y2)
cvLine(black,cvPoint(vec_lines[i].x1,vec_lines[i].y1),cvPoint(vec_lines[i].x2,vec_lines[i].y2),CV_RGB(255,255,255),1, CV_AA);
}
/*cvNamedWindow("img", 0);
cvShowImage("img", img);*/
//cvSaveImage("lines_detect.png",black/*img*/);
/* free memory */
//cvReleaseImage(&grey);
free_image_double(image);
free_ntuple_list(out);
return black;
}