1、在使用相机抓图时,相机第一次触发,没有图像。一开始怀疑软件触发后,去取图,可能相机并没准备好,因此加sleep延时,也没解决。不知道什么原因。
代码流程:
CameraSetSnapMode(0, CAMERA_SNAP_TRIGGER);
int m_width = 0, m_height = 0, len = 0;
CameraGetImageSize(0, &m_width, &m_height);
CameraGetImageBufferSize(0, &len, CAMERA_IMAGE_BMP);
unsigned char* m_inBuf = new unsigned char[len];
dataRed = new unsigned char[len];
dataGreen = new unsigned char[len];
dataBlue = new unsigned char[len];
CameraTriggerShot(0); //相机触发
sleep(5000); //延时
if (CameraQueryImage(0, m_inBuf, &len,
CAMERA_IMAGE_RGB24) == API_OK)
{
for (int i = 0; i < m_height; i++)
{
for (int j = 0; j < m_width; j++)
{
memcpy(dataRed + m_width*i + j, m_inBuf + 3 * i*m_width + 3 * j, sizeof(unsigned char));
memcpy(dataGreen + m_width*i + j, m_inBuf + 3 * i*m_width + 3 * j + 1, sizeof(unsigned char));
memcpy(dataBlue + m_width*i + j, m_inBuf + 3 * i*m_width + 3 * j + 2, sizeof(unsigned char));
}
}
GenImage3Extern(&Image, "byte", m_width, m_height, (Hlong)(dataRed), (Hlong)(dataGreen), (Hlong)(dataBlue), 0);
DispObj(Image, m_hWndID);
}
后来在相机sdk上 CameraTriggerShot() 是有返回值的,用来判断是否触发。于是增加了对CameraTriggerShot操作的判断
if(CameraTriggerShot(0)==API_OK)
{
if (CameraQueryImage(0, m_inBuf, &len,
CAMERA_IMAGE_RGB24) == API_OK)
{
........
}
}
2、这个问题比较诡异,第一次开自动运行线程,程序判断结果能正确显示出来。当停止自动线程后,再打开,执行结果就无法正确显示出来了,把形状模板不知道显示到哪个窗口了。这里用的是halcon自动生成的函数
void dev_display_shape_matching_results(HTuple hv_ModelID, HTuple hv_Color, HTuple hv_Row,HTuple hv_Column, HTuple hv_Angle,
HTuple hv_ScaleR, HTuple hv_ScaleC, HTuple hv_Model)
函数体内用的是DispObj(ho_ContoursAffinTrans, m_hWnd); m_hWnd同程序其他位置的变量是一样的,都是类的变量。调整过很多方法,全局变量,静态变量,全局函数,类的静态函数,全局函数。都不好解决这个问题。
无意中找到了halcon另两算子
vector_angle_to_rigid (0, 0, 0, RowCheck, ColumnCheck, AngleCheck, MovementOfObject)
affine_trans_contour_xld (ShapeModel, ModelAtNewPosition, MovementOfObject)
解决了这个问题。