读取图片
imread()用来读取图片,可以是多种格式的
Imread根据文件名确定要读取的文件,自动分配图像数据所需的内存。Imread()可以读取多种图像格式,包括BMP,DIB,JPEG,JPE,PNG,PBM,PGM,PPM,SR,RAS和TIFF。
If(Img.empty()) return -1;用来检测图像是否被读取。
namedWindow(),在屏幕上打开一个可以包含和显示图像的窗口。
Imshow()用来显示图片;
Waitkey()函数和用来停止函数并等待点击,若果参数设置为0或者负数,程序将无限期等待,若给定一个正数,程序将等待毫秒数。
namedWindow(),在屏幕上打开一个可以包含和显示图像的窗口。
destory()用来摧毁窗体本身,关闭窗口并释放任何相关的内存使用。
读取视频
用OpenCV播放视频几乎和显示一张图片一样简单。我们面临的唯一新问题是,我们需要某种循环来按顺序读取每一帧。
int main() {
cv::Mat fram;//实例化对象用来保存视频的每一帧
cv::VideoCapture cap;//实例化视频捕获对象
namedWindow("catchVideo", cv::WINDOW_AUTOSIZE);//命名窗口
cap.open("juzi.mp4");//打开橘子视频,项目目录中
while (1) {
cap >> fram;
if (!fram.data)break;
cv::imshow("catchvideo", fram);
if (cv::waitKey(33) >= 0)break;
}
return 0;
}
跟踪条滑块在视频中移动
using namespace std;
int g_slider_position = 0;
int g_run = 1, g_dontset = 0; //start out in single step mode
cv::VideoCapture g_cap;//定义视频捕获对象
void onTrackbarSlide(int pos, void*) {
g_cap.set(cv::CAP_PROP_POS_FRAMES, pos);
if (!g_dontset)
g_run = 1;
g_dontset = 0;
}
int main(int argc, char** argv) {
cv::namedWindow("Example2_4", cv::WINDOW_AUTOSIZE);
g_cap.open("juzi.mp4");
int frames = (int)g_cap.get(cv::CAP_PROP_FRAME_COUNT);
int tmpw = (int)g_cap.get(cv::CAP_PROP_FRAME_WIDTH);
int tmph = (int)g_cap.get(cv::CAP_PROP_FRAME_HEIGHT);
cout << "Video has " << frames << " frames of dimensions("
<< tmpw << ", " << tmph << ")." << endl;
cv::createTrackbar("Position", "Example2_4", &g_slider_position, frames,
onTrackbarSlide);
cv::Mat frame;
while (1) {
if (g_run != 0) {
g_cap >> frame; if (!frame.data) break;
int current_pos = (int)g_cap.get(cv::CAP_PROP_POS_FRAMES);
g_dontset = 1;
cv::setTrackbarPos("Position", "Example2_4", current_pos);
cv::imshow("Example2_4", frame);
g_run -= 1;
}
char c = (char)cv::waitKey(10);
if (c == 's') // single step
{
g_run = 1; cout << "Single step, run = " << g_run << endl;
}
if (c == 'r') // run mode
{
g_run = -1; cout << "Run mode, run = " << g_run << endl;
}
if (c == 27)
break;
}
return(0);
}