关于opencv的小知识点总结

【结论】:

对于opencv2.4.3 使用vs2010建立工程,然后使用vs2017打开,打开后并不升级程序,这样依然使用的是vs2010的sdk,只不过是使用vs2017这个工具开发。

直接使用vs2017 并配合opencv2.4.3时 会有很多问题,最好不要这样操作。

mat的地址如果是绝对地址,则要// 两个

string strPath = "e://test.bmp";
	Mat mat = imread(strPath);

opencv 读取固定地址的图像时mat为空

cv::Mat mat1 = cv::imread("./20201029-104759.jpg");
 if (mat1.empty())
 {
  return;
 }

用上面读取时发现 mat为空,使用绝对位置,而且带两个双斜杠才可以。
解决办法:

cv::Mat mat1 = cv::imread("E://wokspace//excercise//TestOpencv_MFC//Debug//20201029-104759.jpg");
 if (mat1.empty())
 {
  return;
 }

参考:https://blog.csdn.net/im6520/article/details/75103651?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

opencv中 图片保存

图片格式有些是自带压缩格式的,bmp没有任何压缩,jpg是自带压缩
https://www.cnblogs.com/skyfsm/p/7136709.html

MFC中使用CvvImage显示相机数据,发现界面图像与相机保存的图像相反,

如图:左图为 相机界面显示 右图为相机保存数据显示
在这里插入图片描述
方法一: 添加origin =1

m_IplImage = cvCreateImageHeader(cvSize(sFrameHead.iWidth, sFrameHead.iHeight), IPL_DEPTH_8U, sFrameHead.uiMediaType == CAMERA_MEDIA_TYPE_MONO8 ? 1 : 3);
        m_IplImage->origin = 1;//默认为1,2020.10.29 如果没有此句,相机界面显示的图像 与 保存的图像是进行翻转过的
  cvSetData(m_IplImage, m_pFrameBuffer, sFrameHead.iWidth*(sFrameHead.uiMediaType == CAMERA_MEDIA_TYPE_MONO8 ? 1 : 3));

添加一句 m_IplImage->origin = 1;解决问题

参考【MFC两种视频图像採集方法】DirectShow与Opencv
https://www.cnblogs.com/mfrbuaa/p/5125392.html:
https://blog.csdn.net/hamburry/article/details/40456343

方法二: cvCreateImageHeader 创建的origin 默认为0,而从摄像头读取的数据 origin为1,数据扫描是从下往上,左下为原始。 为了配合创建默认为0的东西,需要相机进行水平镜像就可以了,这样就实现了方向从上到下。

https://blog.csdn.net/fightingforcv/article/details/19476591

IplImage图像与BYTE图像

https://blog.csdn.net/jnulzl/article/details/48139993

cvSaveImage保存图像:

只有8位单通道或者三通道,如果深度、通道、格式不对的话,要使用cvCvtScale 和 cvCvtColor来进行转换。
https://blog.csdn.net/chenaini119/article/details/21037403?utm_medium=distribute.pc_relevant.none-task-blog-title-3&spm=1001.2101.3001.4242

如果图片上画线时,颜色不是彩色,需要将灰度图转化为 rgb图

IplImage *pImage = NS_CV_HELPER::CvCreateImage(cvGetSize(plImage), IPL_DEPTH_8U, 3);
	NS_CV_HELPER::CvCvtColor(plImage, pImage, CV_GRAY2RGB);

使用fitEllipse 拟合椭圆时,程序崩溃。

RotatedRect ellipse_rect = fitEllipse(contours[i]); 进行拟合时,程序崩溃

解析: 椭圆拟合最低好像五个点,所以对五个点一下的是不能进行拟合的

findContours_new(bina, contours, hie, RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, Point(0, 0));
	
	int contours_size = contours.size();
	for (int i = 0; i < contours_size; i++) {
		//2020.11.10 add 椭圆拟合不小于5个点
		if (contours.at(i).size() <= 5)
		{
			continue;
		}
		RotatedRect ellipse_rect = fitEllipse(contours[i]);  
		。。。。。。。。

OpenCV 应用fitEllipse函数一种异常问题分析
https://blog.csdn.net/chaipp0607/article/details/53998116

findContours函数

findContours函数在VS2010中运行没问题,但在VS2017中运行有问题,需要修改该函数。

fitEllipse函数 处程序崩溃

fitEllipse函数在拟合 椭圆时,**必须有5个点以上才可以,**否则程序崩溃。

if (contours.at(i).size() <= 5)
		{
			continue;
		}

在mat图像上画 圆 画点

cv::circle(bin_src, final_sort_ellipse_list[3], 10, cv::Scalar(255, 0, 0), 10);
	

相机图像传输

使用迈德威视的千兆网口相机,其中图像传输 所占网络100% 是因为图像太大了,大小为2448*2048 ,cpu占用率很高,可以尝试将图像大小降低下来,测试一下。

在这里插入图片描述

两个矩形的交集与并集

Rect rt3 = rt1 & rt2; //交集  两个矩形的交集
Rect rt4 = rt1 | rt2;//并集   两个矩形的并集

颜色

Scalar(255, 0 , 0) 表示 BGR alpha

Mat类型 Iplimage类型

opencv 1.0中图像存储为IplImage 这个使用时需要开辟 和释放指针,而oepnc2.0以上的版本进行了优化,使用Mat类型,就不用自己进行释放指针了,简化了操作。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值