Я недавно работал с OpenCV и C++ для проекта, и я обнаружил странную вещь: , когда я пытаюсь получить доступ к одному пиксельному значению в IplImage и назначить другое значение, он может работать правильно, но результат заключается в том, что он может работать только частью всего изображения.opencv: одиночная ошибка смещения пикселей
соответствующий код:
IplImage* output_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);
IplImage* current_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);
while((current_frame = cvQueryFrame(video_gray)) != 0)
{
for (int row=0;row<height;row++)
{
uchar* ptr_current_frame = (uchar *)(current_frame->imageData+current_frame->widthStep*row);
uchar* ptr_output_frame = (uchar *)(output_frame->imageData+output_frame->widthStep*row);
for (int cols=0;cols<width;cols++)
{
//other codes...
ptr_output_frame[cols]=ptr_current_frame[cols];
}
}
}
В результате левая часть изображения была скопирована в output_frame. И когда я запускаю следующий код:
IplImage* output_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);
IplImage* current_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);
while((current_frame = cvQueryFrame(video_gray)) != 0)
{
for (int row=0;row<height;row++)
{
uchar* ptr_current_frame = (uchar *)current_frame->imageData+current_frame->width*row;
uchar* ptr_output_frame = (uchar *)output_frame->imageData+output_frame->width*row;
for (int cols=0;cols<width;cols++)
{
//other codes...
ptr_output_frame[cols]=ptr_current_frame[cols];
}
}
}
Я получил вверх часть изображения в output_frame.
Я не могу получить копию всего изображения в output_frame в любом случае. Может ли кто-нибудь помочь мне в этом? Большое спасибо!
[Обновления] 05/16/2015
Я обнаружил, что output_frame-> widthStep отличается от current-> widthStep после current_frame выполняется в следующем коде:
current_frame = cvQueryFrame(video_gray);
Это делает что первая часть кода не работает. Но я все еще не знаю, почему вторая часть кода не работает. Теперь у меня есть все мои коды и надеюсь, что вы можете помочь мне сделать это правильно. Я очень ценю вашу помощь.
CvCapture* video_gray = cvCreateFileCapture("test_gray.avi");
const double fps = cvGetCaptureProperty(video_gray, CV_CAP_PROP_FPS);
const int width = (int)cvGetCaptureProperty(video_gray, CV_CAP_PROP_FRAME_WIDTH);
const int height = (int)cvGetCaptureProperty(video_gray, CV_CAP_PROP_FRAME_HEIGHT);
const CvSize size = cvSize(width, height);
IplImage* current_frame = cvCreateImage(size, IPL_DEPTH_8U, 1);
IplImage* output_frame=cvCreateImage(size, IPL_DEPTH_8U, 1);
int flag = 0;
cvNamedWindow("test",1);
cvNamedWindow("test2",1);
while((current_frame = cvQueryFrame(video_gray)) != 0)
{
cout<<flag++<<endl;
if(flag<500) continue;
for (int row=0;row<height;row++)
{
uchar* ptr_current_frame = (uchar *)(current_frame->imageData+current_frame->widthStep*row);
uchar* ptr_output_frame = (uchar *)(output_frame->imageData+output_frame->widthStep*row);
for (int cols=0;cols<width;cols++)
{
ptr_output_frame[cols]= ptr_current_frame[cols];
}
}
cvShowImage("test",output_frame);
cvShowImage("test2",current_frame);
cvWaitKey(10);
}
Если вы используете C++, тогда, пожалуйста, не используйте IplImage, но cv :: Mat image. – Micka
Как инициализируется 'размер'? Что такое 'height' и какое значение' current_frame-> width' и 'current_frame-> height' на каждой итерации? – Micka
Спасибо. Да, я попытался перенести IplImage на Mat и использовать current_frame_mat.at (строка, cols), чтобы присвоить значение. Но результат остается тем же, и я не могу скопировать весь образ. Что касается размера, я инициализировал его следующим образом: CvCapture * video_gray = cvCreateFileCapture ("test_gray.avi"); const int width = (int) cvGetCaptureProperty (video_gray, CV_CAP_PROP_FRAME_WIDTH); \t const int height = (int) cvGetCaptureProperty (video_gray, CV_CAP_PROP_FRAME_HEIGHT); const CvSize size = cvSize (ширина, высота); Высота current_frame-> width и current_frame-> не изменяется на каждой итерации. –
marvelous