机器视觉
文章平均质量分 78
Halcon和OpenCV
闻缺陷则喜何志丹
本人拙作《喜缺全书算法册》欢迎指教,可在CSDN下载https://download.csdn.net/download/he_zhidan/88368465
展开
-
避免halcon的HObject被释放
某项目由我统一管理HObject(区域和图像)的释放。发现某区域被释放。可能有两种情况:a,区域交给我后,释放了。b,获取我的区域后释放了。最终证明是第二种情况,证明如下:a,Add函数复制区域,Get函数不复制区域,问题依然存在。b,Add函数不复制,Get函数复制问题消失。和项目程序员沟通的结果是:大家都没修改。难道是旧代码的问题?Get函数中,之前改成:在Dispose函数中加断点:通过调用堆栈定义到问题所在。果然是旧代码。原创 2024-08-20 10:41:03 · 427 阅读 · 11 评论 -
HOperatorSet.Rgb1ToGray的原理研究
我们来试验一下,转换细节。我创建三个1*1的灰度图,分别测试以小六种情况。原始定义:rgb1_to_gray 类似函数rgb3_to_gray。开发环境:win7 + VS2022 + halcon12。规则很明显,从官网查到的如下,和我们的测试结果类似。六,R=200,G=200,B=200。二,R=200,G=0 ,B = 0。三,R=0 ,G=200,B=0。五,R=200,G=200,B=0。一,R=100,G=0,B=0。四,R=0,G=0,B=200。原创 2023-08-12 09:22:28 · 235 阅读 · 0 评论 -
halcon 区域Region(HObject)的传输
/region有4个点(1,1),(1,2),(2,1),(2,2)//region有4个点(5,1),(5,2),(6,1),(6,2)//region有4个点的行长码: 1行1列到2列 2行1列到2列。存储文件,以二进制的方式读取,存储格式就是游程编码。末尾是行号 起始列号 结束列号。也可使用GenRegionPoints。获取:游程编码,行号、起始列、行列。原创 2023-09-15 09:13:26 · 359 阅读 · 1 评论 -
C# halcon SubImage的使用
imageMinuend和imageSubtrahend的CountObj和CountChannel必须相同。则imageSub此行此列的灰度为;以byte图为例,小于0,为0;大于255,为255。x2=imageSubtrahend此行此列的灰度。x1=imageMinuend此行此列的灰度。原创 2023-09-08 09:39:11 · 511 阅读 · 0 评论 -
关于HOperatorSet.CountChannels的注意事项
两台电脑的相机都是5120*5120,存储的文件大下不一样,一个75M,一个100M。怀疑通道数一个为3,一个为4。用HOperatorSet.CountChannels通道数为3和1,不是3和4。发现一个相机有一个3通道的HObject,一个相机有4个1通道的HObject。请硬件人员调成一致。原创 2023-09-07 09:30:38 · 126 阅读 · 0 评论 -
HOperatorSet.GenRandomRegions 有内存泄漏或缓存,释放不掉
除生成的区域数量外,全部用halcon样例的默认值。原创 2023-09-01 09:18:31 · 610 阅读 · 0 评论 -
HOperatorSet.Connection 有内存泄漏或缓存
换了halcol18 halcon12的 debug release都如此。Win7 VS2002 halcon12, 直接运行Debug的exe。先释放regionConnect和先释放region 都如此。大约占用200M,两者的顺序不影响结果。原创 2023-08-31 08:34:12 · 838 阅读 · 0 评论 -
直接对三通道的HObject 阈值分割 结果如何?
对于100M的大img,dUse1到15毫秒,dUse2大约7.8毫秒,dUse3大约8.2毫秒。假定猜测二正确,对结果用ReduceDomain ,各通道的结果会受其它通道干扰。操作系统win7 开发工具:VS2022 图像处理库:halcon12。CreateImage函数用于 指定宽度和byte数组创建图像。猜测一:只对第一个通道进行阈值分割,可能有多个区域。猜测二,对三个通道分别进行阈值分割,有多个区域。区域数量1,面积0。区域数量1,面积1。区域数量1,面积2。结论证明猜测一正确。原创 2023-08-10 14:39:51 · 143 阅读 · 0 评论 -
GenImageInterleaved Wrong type of control parameter 1
HALCONerror#1201:Wrongtypeofcontrolparameter1源码:HObjectrgbImage;constintiRow=1;constintiCol=1;constcharsz[3*iRow*iCol]={1,2,3};try{HalconCpp::GenImageInterleaved(&...原创 2022-05-31 09:50:32 · 1149 阅读 · 2 评论 -
HALCON error #1201: Wrong type of control parameter: 1 in operator threshold
HALCON error #1201: Wrong type of control parameter: 1 in operator threshold错误代码:HTuple tMin, tMax; tMin.Append(3).Append(5.5); tMax.Append(4.0).Append(8); Hobject region; Halcon::threshold(img, ®ion,tMin, tMax);错误原因:tMin各元素类型...原创 2022-02-28 10:52:33 · 2671 阅读 · 0 评论 -
关于Halcon::threshold 用时
Halcon::threshold 利用HTuple一次二值化两组区域比两次Halcon::threshold略快,不到5%。测试环境:VC2013 halcon10CWatch watch; for (int i = 0; i < 100; i++) { Halcon::threshold(imgCoatCheck, &m_regions.m_regionCoatLightNG, dMedialCoatCheckGray + iNGDiffGray, ...原创 2022-02-25 15:44:15 · 356 阅读 · 0 评论 -
threshold用时
threshold 16000行,16000列,用时13msthreshold 16000行,3列,大约1.3ms某个算法,我优化后反而大大变慢 才发现的。VC2013 halcon10。可能原因: halcon进行了加速。原创 2022-02-23 18:30:18 · 466 阅读 · 0 评论 -
halcon的Hobject转HObject
非托管C++代码:class CPLUSALOG_API_20211029 CCTest{public: CCTest(); int* Get(); ~CCTest();protected: Hobject* m_pRegion;} CCTest::CCTest(){ m_pRegion = new Hobject(); Halcon::gen_circle(m_pRegion, 10.0, 10, 10);}int* CCTest::G...原创 2022-01-25 10:11:57 · 1558 阅读 · 3 评论 -
HOperatorSet.GenRectangle1 参数是负数的矩形
默认会被裁剪掉。HOperatorSet.SetSystem("clip_region", "false");就好了原创 2021-12-22 13:14:43 · 828 阅读 · 0 评论 -
halcon SetPart的缺陷
代码:void ShowRect(int iWideSize) { hWindowControl1.HalconWindow.ClearWindow(); hWindowControl1.HalconWindow.SetPart(0, 0, iWideSize, iWideSize); HObject rect; HOperatorSet.GenRectangle1(out rect, 0,...原创 2021-12-22 11:52:04 · 627 阅读 · 0 评论 -
StretchDIBits 直接使用cv::Mat的数据有可能显示错误的问题
StretchDIBits(hDC, 0, 0, img.cols,//drect.right, //显示窗口宽度 img.rows,//drect.bottom, //显示窗口高度 0, 0, img.cols, //图像宽度 img.rows, //图原创 2017-07-16 10:44:00 · 811 阅读 · 0 评论 -
findContours
findContours 会改变第一个参数(矩阵)的值, 一定要留意。原创 2017-07-23 10:29:02 · 456 阅读 · 0 评论 -
为cv::Point 重载了<,但VS2010找不到
将此<放到命名空间cv中就可以了原创 2017-08-18 13:23:02 · 399 阅读 · 0 评论 -
cv::sort和cv::sortIdx
//按行按 升序排序 uchar a[][3] = {{1,2,13},{6,5,14},{7,8,19}}; cv::Mat mat(1,9,CV_8UC1,a,1); cv::sort(mat,mat,CV_SORT_EVERY_ROW + CV_SORT_ASCENDING);//按行按 升序排序索引uchar a[][3] = {{11,12,13原创 2017-09-07 16:53:36 · 3884 阅读 · 0 评论 -
矩阵初始化的缺陷
int a[][3] = {{1,2,3},{6,5,4},{7,8,9}}; cv::Mat mat(1,9,CV_8UC1,a,1);结果为:1,0,0,0,2,0,0,0,3这样改就好了"int a[][3] => uchar a[][3] ",结果就是1,2,3,4,5,6,7,8,9了原创 2017-09-07 12:42:22 · 424 阅读 · 0 评论 -
并行Zhang细化算法FPA算法
并行Zhang细化算法 和 FPA算法 ,的规则好像完全一样。// p9 p2 p3 // p8 p1 p4 // p7 p6 p5 前景点为1,背景点为0条件1:p1为前景点条件2: 8邻域的点数>=2且条件3: 8领域01模式数为1。条件4:p2 * p4 * p6 == 0 条件5:p4 * p6 * p8 == 0条件原创 2017-09-11 18:46:03 · 1992 阅读 · 0 评论 -
8邻域的01模式和连通性
d1右边的点,d2右上,d3上... 前景点的灰度为1,背景点的灰度0方法一:d1-d1*d2*d3+d3-d3*d4*d5+d5-d5*d6*d7+d7-d7*d8*d1方法二:8邻域的01模式和。这两种方法的结果不一样,256种情况有90多种不同。这90多种情况的bmp见压缩包,http://download.csdn.net/download/he_zhidan/997269原创 2017-09-11 10:08:42 · 1401 阅读 · 1 评论 -
Hilditch 细化(实现二)
此实现5个条件:1,,前景点。2,8邻域前景点2到6。3,8邻域联通区域1。4,2个像素宽的垂直条不完全被腐蚀掉。5,2个像素宽的水平条不完全被腐蚀掉。原创 2017-09-08 18:56:00 · 1858 阅读 · 0 评论 -
Hilditch 细化(实现一)
对于当前像素点,扫描它的8邻域,如果邻域的像素值为255,则b[i]=1(i=0…8),像素值为128(表示该像素点在前面的循环中被标记为删除),b[i]=-1,如果像素值为0,则b[i]=0。下面会根据b[i]的值进行6个条件判断,如果条件满足,则会标记该像素值为GRAY(128)。1. b[0]=1,即当前像素必须为前景点。2. 1-abs(b1) + 1 – abs(b3原创 2017-09-05 17:56:46 · 1752 阅读 · 0 评论 -
OpenCV演示程序 汇总
演示程序解压就可以运行,无需安装其他程序、组件。已知问题如下:欢迎指教。黑点和气泡 误判高达8分之一, 肉眼看起来很明显的, 气泡有明显的亮圈。试验了如下几种,效果都不明显:1,直接surf提取特征。2, 100到120的灰度,统一成110,再surf提取特征。3,0到100统一成0,120以上统一成255,再surf提取特征。4,转成色差,每个点的灰度=绝原创 2017-07-14 08:10:58 · 1656 阅读 · 0 评论 -
判断若干个点是否前景的习题
假定P1、P2、P3、P4、P5、P6、P7、P8的值只能是1或0。1,请写一个表达式判断: P1、P2为1,P3、P4为0,P5、P6、P7、P8任意。2,以下表达式和条件组是否等价:if( P1 + P2 + P3 + P4 == 3 ){}以下4个条件是否有至少有一个成立:a,P1、P2、P3为1。b,P2、P3、P4为1。c,P1、P2、P4为1。d原创 2017-09-10 09:30:53 · 223 阅读 · 0 评论 -
cv::imread读取文件失败
环境:VS2010 + OPENCV 2.4.10不是图片的问题,cvLoadImage 可以成功读取。最终发现问题是:Debug版的exe调用Release版的lib引起的。原创 2017-07-04 11:01:58 · 2075 阅读 · 0 评论