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)
解決了這個問題。