Я использую OpenCV 2.4.6. Я нашел в Интернете пример получения кадра с камеры. Он работает хорошо (он отображает мое уродливое лицо на экране). Тем не менее, я абсолютно не могу получить пиксельные данные из фреймов. Я нашел здесь несколько тем: http://answers.opencv.org/question/1934/reading-pixel-values-from-a-frame-of-a-video/, но это не работает для меня.
Вот код - в комментариях я указал, что не так.
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main() {
int c;
IplImage* img;
CvCapture* capture = cvCaptureFromCAM(1);
cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE);
while(1) {
img = cvQueryFrame(capture);
uchar* data = (uchar*)img->imageData; // access violation
// this does not work either
//Mat m(img);
//uchar a = m.data[0]; // access violation
cvShowImage("mainWin", img);
c = cvWaitKey(10);
if(c == 27)
break;
}
}
Не могли бы вы дать мне несколько предложений, пожалуйста?
Я предлагаю использовать новую структуру Mat
вместо IplImage
так как ваш вопрос помечен тегом C++. Для вашей задачи вы можете использовать элемент data
Mat
- it указывает на внутреннюю память Mat
. Например, Mat img; uchar* data = img.data;
Mat img; uchar* data = img.data;
, Здесь полный пример
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
int main() {
int c;
Mat img;
VideoCapture capture(0);
namedWindow("mainWin", CV_WINDOW_AUTOSIZE);
bool readOk = true;
while(capture.isOpened()) {
readOk = capture.read(img);
// make sure we grabbed the frame successfully
if (!readOk) {
std::cout << "No frame" << std::endl;
break;
}
uchar* data = img.data; // this should work
imshow("mainWin", img);
c = waitKey(10);
if(c == 27)
break;
}
}
cv::Mat
вместоIplImage
как в примере?