我在嵌入式目标板上使用OpenCV(FriendlyARM mini6410,运行linux内核2.6.38的处理器臂1176)。 我使用为板提供的工具链编译了OpenCV 2.4.4库,可以在ftp中找到(请参阅FriendlyARM的website)。我禁用了GTK,ffmpeg并启用了v4l。该库已成功编译。
然后我写代码:
#include <opencv.hpp>
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main()
{
int i;
cout << "initialise" << endl;
IplImage* img=0;
cout << "capturing ..." << endl;
CvCapture* capture = cvCaptureFromCAM(2);
cout << "get here" << endl;
if(!capture){
cout << "not capture" << endl;
return -1;
}
cout << "captured" << endl;
img=cvQueryFrame(capture);
IplImage* img1 = cvCreateImage(cvGetSize(img),8,3);
// cvCvtColor(img,img1,CV_RGB2GRAY);
cvCopy(img, img1);
cvSaveImage("cam_snap.jpg",img1);
cvReleaseImage( &img1 );
cvReleaseImage( &img );
cvReleaseCapture( &capture );
cout << "exit" << endl;
return 0;
}
代码已成功构建。我在目标板上运行.elf可执行文件,连接到相机(PS3眼睛),但生成的图像看起来像一个破碎的电视(类似噪音):
在我的主机中,生成的图像与预期一致(相机前面的场景)。你能否提出我出现问题的建议或者我应该从哪里开始调试?
答案 0 :(得分:1)
你应该检查你的深度和频道。这可能是一个对齐的问题,而且要小心你的图像可能在BGR而不是RGB。 你应该在C ++和VideoCapture中使用cv :: Mat而不是IplImage而不是CVCapture。
此代码示例应该有效。 (未在与您相同的拱门上进行测试)
#include <opencv.hpp>
#include <highgui/highgui.hpp>
#include <imgproc/imgproc.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
int main()
{
VideoCapture capture = cv::VideoCapture(0);
cout << "get here" << endl;
if(!capture.isOpened()) // check if we succeeded
return -1;
cout << "captured" << endl;
Mat img;
capture >> img;
imwrite("./test.png", img);
capture.release();
cout << "exit" << endl;
return 0;
}
希望它有所帮助。
答案 1 :(得分:0)
好的,确认。 mini 6410运行USB 1.0,ps3眼睛需要USB 2.0。我使用标准网络摄像头(中国产品,itech pc相机)尝试了这个程序,效果非常好。保存的图像显示在相机前面的场景