嵌入式程序调试与opencv图像库的练习
在ubuntu下使用GDB调试
下面的代码实现对一个整型数的反转功能,比如输入123,则
输出321。 但输入100时,程序的输出结果却不正确,请找出问题。
#include <stdio.h>
void ShowRevertNum(int iNum)
{
while(iNum>10)
{
printf("%d",iNum % 10);
iNum = iNum /10;
}
printf("%d\n",iNum);
}
int main(void)
{
int iNum;
printf("Please input a number:");
scanf("%d",&iNum);
printf("After revert:");
ShowRevertNum(iNum);
}
编译运行
gdb test1
对目标文件进行gdb调试
编写一个打开图片进行特效显示的代码
放一张图片在home路径下
创建一个文件夹,并在文件夹内创建"test1.cpp"文件,文件中写入代码
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
CvPoint center;
double scale = -3;
IplImage* image = cvLoadImage("lena.jpg");
argc == 2? cvLoadImage(argv[1]) : 0;
cvShowImage("Image", image);
if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);
for (int i = 0;i<image->height;i++)
for (int j = 0;j<image->width;j++) {
double dx = (double)(j - center.x) / center.x;
double dy = (double)(i - center.y) / center.y;
double weight = exp((dx*dx + dy*dy)*scale);
uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);
ptr[0] = cvRound(ptr[0] * weight);
ptr[1] = cvRound(ptr[1] * weight);
ptr[2] = cvRound(ptr[2] * weight);
}
Mat src;Mat dst;
src = cvarrToMat(image);
cv::imwrite("test.png", src);
cvNamedWindow("test",1); imshow("test", src);
cvWaitKey();
return 0;
}
编译并运行
原图与运行后的图片
原图
经过处理后的图片
练习使用opencv库编写打开摄像头压缩视频的程序
一个打开摄像头显示处理视频的程序代码
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
VideoCapture capture(0);
while(1)
{
Mat frame;
capture >> frame;
imshow(“读取视频帧”,frame);
waitKey(30);
}
system(“pause”);
return 0;
}
在第七行代码中
VideoCapture capture(0);
videocapture属于videoio子模块程序运行的时候会检查是否为空,如果为空(可以用0代替)默认打开摄像头,如果是路径则默认打开视频源。
Mat是一个类。由两部分数据组成:矩阵头(包括矩阵尺寸、存储方法、存储地址等信息)和一个指向所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针。
waitKey延时越长 fps越小 出现跳帧 摄像头显示变卡,故要有一定的延时。
示例代码会在while循环中一直运行,你如果试图用鼠标关闭图像显示窗口,会发现始终关不掉。需要用键盘Ctrl+C 强制中断程序,非常不友好。可以在"while"中加入一个"break"
链接: ubuntu下安装opencv.